这是有趣的情况下更新MySQL是偶尔缓慢。 背景:48GB InnoDB缓冲高速缓存,512MB IB日志。 InnoDB表与40mln行。 结构和索引:
CREATE TABLE `VisitorCompetition` (
`VisitorCompetitionId` bigint(20) NOT NULL AUTO_INCREMENT,
`UserId` bigint(20) NOT NULL,
`CompetitionInstanceId` bigint(20) NOT NULL,
`Score` bigint(20) NOT NULL DEFAULT '0',
`Visits` bigint(20) DEFAULT NULL,
`Status` varchar(255) NOT NULL,
`RankAtCompletion` int(11) DEFAULT NULL,
`SessionId` varchar(36) DEFAULT NULL,
`SharedDate` timestamp NULL DEFAULT NULL,
`CreatedDate` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedDate` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`ModifiedBy` varchar(55) DEFAULT NULL,
`CaseId` int(11) NOT NULL,
PRIMARY KEY (`VisitorCompetitionId`),
UNIQUE KEY `uc_UserId_CompetitionInstanceId` (`UserId`,`CompetitionInstanceId`),
KEY `idx_VisitorCompetition_TI_S` (`CompetitionInstanceId`,`Status`),
KEY `IDX_CreatedDate` (`CreatedDate`),
CONSTRAINT `fk1` FOREIGN KEY (`CompetitionInstanceId`)
REFERENCES `CompetitionInstance` (`CompetitionInstanceId`)
) ENGINE=InnoDB AUTO_INCREMENT=74011154 DEFAULT CHARSET=utf8
当有看起来像这样的更新:
update VisitorCompetition
set
Status='CLOSED',
score=770000,
visits=null,
RankAtCompletion=null,
sharedDate=null,
LastModifiedDate=current_timestamp(6),
ModifiedBy='11.12.12.200'
where VisitorCompetitionId=99999965 and Status = 'CLOSED';
注意在PK where子句和附加字段作为条件。 此更新执行〜20次/秒。 在大多数情况下,这会立即更新运行,但每天几次花费100-300秒才能完成,它显示了慢日志。 但为啥要此行为的原因是什么?
更新#1:排除了检查点,触发和查询缓存作为一个可能的根本原因。 events_stages_history_long表示本作的更新之一:
stage/sql/updating 188.025130
stage/sql/end 0.000004
stage/sql/query end 0.000002
stage/sql/closing tables 0.000004
stage/sql/freeing items 0.000002
stage/sql/logging slow query 0.000032
stage/sql/cleaning up 0.000001
类似的问题(但不完全是我的情况): MySQL的更新回吐(太)很长一段时间
更新2:我的情况下,更新速度慢始终与互斥争尖峰相关。 看起来这是根本原因。