在PK和MySQL的另一场表更新零星缓慢(Table update on PK and anothe

2019-09-30 17:27发布

这是有趣的情况下更新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:我的情况下,更新速度慢始终与互斥争尖峰相关。 看起来这是根本原因。

Answer 1:

虽然可能有很多原因,我想提什么在我的情况的根本原因。 这是在那里数百应用会话试图更新同一行,导致锁升级,互斥争,结果慢执行的应用程序错误。 之后,我们的开发团队固定的代码,这个问题被迅速解决。 感谢所有。



文章来源: Table update on PK and another field in MySQL is sporadically slow