使用主键偶尔更新缓慢
occasional slow UPDATE using primary key
我在 MySQL 5.5.53 中有一个 InnoDB table,其中的简单更新如
UPDATE mytable SET acol = 'value' WHERE id = 42;
挂几秒钟。 id
是table的主键。
如果我使用
启用查询分析
SET profiling = 1;
然后 运行 查询并查看配置文件,我看到类似:
show profile;
+------------------------------+----------+
| Status | Duration |
+------------------------------+----------+
| starting | 0.000077 |
| checking permissions | 0.000008 |
| Opening tables | 0.000024 |
| System lock | 0.000008 |
| init | 0.000346 |
| Updating | 0.000108 |
| end | 0.000004 |
| Waiting for query cache lock | 0.000002 |
| end | 3.616845 |
| query end | 0.000016 |
| closing tables | 0.000015 |
| freeing items | 0.000023 |
| logging slow query | 0.000003 |
| logging slow query | 0.000048 |
| cleaning up | 0.000004 |
+------------------------------+----------+
也就是所有的时间都花在了end
.
end
This occurs at the end but before the cleanup of ALTER TABLE
, CREATE VIEW
, DELETE
, INSERT
, SELECT
, or UPDATE
statements.
这么简单的语句怎么会在这种状态下耗费这么长时间?
原来是查询缓存的问题
如果我用
禁用它
SET GLOBAL query_cache_size = 0;
SET GLOBAL query_cache_type = 0;
问题消失了。
一定是使查询缓存条目无效导致查询挂起这么长时间。
我在 MySQL 5.5.53 中有一个 InnoDB table,其中的简单更新如
UPDATE mytable SET acol = 'value' WHERE id = 42;
挂几秒钟。 id
是table的主键。
如果我使用
启用查询分析SET profiling = 1;
然后 运行 查询并查看配置文件,我看到类似:
show profile;
+------------------------------+----------+
| Status | Duration |
+------------------------------+----------+
| starting | 0.000077 |
| checking permissions | 0.000008 |
| Opening tables | 0.000024 |
| System lock | 0.000008 |
| init | 0.000346 |
| Updating | 0.000108 |
| end | 0.000004 |
| Waiting for query cache lock | 0.000002 |
| end | 3.616845 |
| query end | 0.000016 |
| closing tables | 0.000015 |
| freeing items | 0.000023 |
| logging slow query | 0.000003 |
| logging slow query | 0.000048 |
| cleaning up | 0.000004 |
+------------------------------+----------+
也就是所有的时间都花在了end
.
end
This occurs at the end but before the cleanup of
ALTER TABLE
,CREATE VIEW
,DELETE
,INSERT
,SELECT
, orUPDATE
statements.
这么简单的语句怎么会在这种状态下耗费这么长时间?
原来是查询缓存的问题
如果我用
禁用它SET GLOBAL query_cache_size = 0;
SET GLOBAL query_cache_type = 0;
问题消失了。
一定是使查询缓存条目无效导致查询挂起这么长时间。