问题描述

我一直在跟踪基于 WP 的站点的慢查询日志 (a long_query_time 的默认值设置为 10),我注意到以下查询经常被记录 –

# User@Host: root[root] @ localhost []
# Query_time: 0  Lock_time: 0  Rows_sent: 394  Rows_examined: 458
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

我不明白这样一个小桌子可以花多少时间来执行。这只是一些其他问题的症状吗? (目前在专用虚拟机上运行 Moodle,phpbb 和 WP) 。

最佳解决方案

更新:查询被记录的原因是它是 doesn’t use an index 。查询时间为 0,即实际执行速度快。如果您不希望记录这些选项,可以取消设置”log-queries-not-using-indexes” 选项。

wp_options 表在自动加载上没有索引,所以查询结束了进行全表扫描。一般来说,这个表不应该太大,所以这不是一个问题,但是我猜这是你的情况发生的。

添加索引可能会解决问题,但是如 TheDeadMedic 在注释中指出的那样,如果 autoload 的值大多数为 yes,或者在 yes 和 no 之间均匀分配,则可能不会:

首先,执行此查询以查看分发如何:

SELECT COUNT(*), autoload FROM wp_options GROUP BY autoload;

如果大部分设置为’no’,您可以通过在自动加载上添加索引来解决问题。

ALTER TABLE wp_options ADD INDEX (`autoload`);

但是,您可能希望了解为什么该表已经变得太大了。可能有一些写得很不好的插件做一些有趣的事情。

次佳解决方案

我偶然发现几天前在我的服务器上运行的 mytop 中提到的查询,实际上每个查询花费了相当长的时间 (约 10 秒)!所以有 real-world 的情况,其中 wp_options 可能会增加到有问题的大小。在我的情况下,我怀疑缓存插件 Cachify 负责腹胀 wp_options 。

这个特定 wp_options 的数据:

5,309 rows
130MB of data

作为一个解决方案,我添加了类似于 Vinay Pai 发布的解决方案的索引,该解决方案完美无缺。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。