为什么在禁用查询缓存时,MySQL 线程经常显示“正在释放项目”状态?

Dan*_*man 17 mysql innodb

当我运行时SHOW PROCESSLIST,经常有大量 INSERT/UPDATE 线程处于“释放项目”状态。

MySQL 手册表明,线程处于这种状态的至少部分原因涉及查询缓存 - 可能由于数据更改而使缓存的查询无效。

但是, myquery_cache_size设置为 0 应该完全禁用查询缓存。

有这么多线程处于这种状态,还有什么其他原因?

相关表使用 InnoDB 存储引擎。

jph*_*ann 7

检查 innodb_thread_concurrency 的值。

对于我的系统,根据MySql 文档中的指南,将值从 8 增加到 32,导致并发报告“释放项目”状态的线程数量明显减少。此外,观察到的平均查询时间下降了一个数量级。

虽然这对整体服务器性能产生了很大的影响,但这并不是“释放项目”的灵丹妙药。我的硬件生态系统让我假设这种状态主要出现在具有“慢”磁盘(2x10k 磁盘 raid 1)的系统上,而在具有更快存储(12x15k 磁盘 raid 10)的系统上不太普遍。因此,也可能需要检查磁盘性能。

祝你好运!

还:

值得注意的是,innodb_thread_concurrency 的默认值根据所使用的 5.0 点版本而完全不同。

默认值更改了几次:MySQL 5.0.8 之前的 8、5.0.8 到 5.0.18 的 20(无限)、5.0.19 到 5.0.20 的 0(无限)和 5.0.21 的 8(有限)在。--来源

这意味着从 5.0.20 到 5.0.21 的看似无害的升级将默认值从无限更改为 8,并随之带来了性能影响。


小智 5

释放项目是一个查询执行阶段,临时结构、缓冲区等被释放。在此阶段完成了一些查询缓存工作,但这并不是那里发生的唯一事情。我建议使用 SHOW PROFILES 来查看这个阶段相对于其他阶段需要多长时间,如果消耗的时间最终成为一个问题,请使用诸如穷人分析器和 oprofile 之类的工具进行故障排除。