MySQL 更新语句需要很长时间才能更新包含 4 行的小表

MySQL 更新语句需要很长时间才能更新包含 4 行的小表

我在 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)

(这个相反的顺序也同样有效。)

相关内容