我正在管理一个电子商务站点,该站点使用在 MySQL 5.6 上运行的流行在线购物车软件。昨天我注意到SHOW PROCESSLIST
报告说 1000 个查询中有 990 个正在等待查询缓存锁定:
mysql> show processlist;
+----------+------------+---------------------+-------------+---------+------+--------------------------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----------+------------+---------------------+-------------+---------+------+--------------------------------+------------------------------------------------------------------------------------------------------+
| 12224065 | sqluser | 10.13.13.13:21716 | mydatabase | Query | 0 | Waiting for query cache lock | SELECT `data` FROM mytable WHERE `foo` = 'bar' |
(...)
但是,Time 始终为 0,并且进程 ID 一直在变化。我的理解是查询等待表锁,但锁在不到一秒后被释放。
这是正常/可接受的行为,还是值得对查询缓存进行一些微调,也许完全删除它?
这是一个非常明显的迹象,表明您的MySQL 查询缓存对您的工作负载弊大于利。有一个序列化瓶颈,每当写入任何表时,如果有查询触及缓存在查询缓存中的该表,则必须锁定查询缓存并清除任何引用这些表的缓存查询。在许多情况下,这弊大于利。
查询缓存仅在写入很少且不频繁的数据库上提供切实的好处。