我在 MySQL 中有一个非常小的表,其中包含四行数据。更新此表需要很长时间,通常需要 50 秒以上。
CREATE TABLE log_CacheQueueEntity
( ID int(11) NOT NULL AUTO_INCREMENT
, EntityName varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
, CodingKey varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
, IsLockedForInitialization tinyint(1) NOT NULL DEFAULT 0
, InitLockPID varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
, PRIMARY KEY (ID)
, UNIQUE KEY UNIQ_8396A7A382A8ABB5 (EntityName)
, UNIQUE KEY UNIQ_8396A7A395B09DD2 (CodingKey)
)
ENGINE=InnoDB AUTO_INCREMENT=5
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
然后我们运行一个简单的更新查询...
UPDATE log_CacheQueueEntity
SET IsLockedForInitialization = 1
, InitLockPID = '1700151964:6556429c27fac7.78065467'
WHERE IsLockedForInitialization = 0
AND InitLockPID IS NULL
AND CodingKey = 'SECTION';
此更新查询可能需要 40-75 秒才能运行...表中只有四条记录。我们还有其他包含数千或数十万条记录的表,它们在几毫秒内运行更新。
EXPLAIN 似乎也没有给我们提供任何信息。我们不知道为什么会发生这种情况。
答案1
50 秒听起来像是lock_wait_timeout
。这意味着另一个连接已锁定该行并且需要很长时间。
也许 mysqldump 正在运行?或者一些大事务?
此外,该综合指数可能有帮助:
INDEX(IsLockedForInitialization, CodingKey)
(这个相反的顺序也同样有效。)