问题
在 MySQL 慢查询日志中,我看到查询需要大量时间,这是因为多个并发事务正在更新同一行:
# Time: 130322 17:42:07
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 48.500955 Lock_time: 0.000062 Rows_sent: 0 Rows_examined: 1
use test;
SET timestamp=1363974127;
UPDATE test SET count = count + 1 WHERE id = 1;
为什么等待的事务不计入 Lock_time 以及什么计入?
重现
这是重现慢查询条目的方法。创建表:
CREATE TABLE test (
id INT PRIMARY KEY,
count INT NOT NULL
);
然后插入一行:
INSERT INTO test VALUES (1,1);
如果我在关闭自动提交的情况下启动 2 个与数据库的连接并在第一个连接中运行:
BEGIN;
UPDATE test SET count = count + 1 WHERE id = 1;
然后使用第二个连接运行:
BEGIN;
UPDATE test SET count = count + 1 WHERE id = 1;
COMMIT;
然后等待一小段时间使这个查询变慢,然后返回第一个连接并执行提交:
COMMIT;
我从问题的开头得到了慢查询条目。