我一直在跟踪基于WP的网站的慢查询日志(将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';


我不明白这么小的表要花多少时间才能执行。这仅仅是其他问题的征兆吗? (当前在专用VM上运行Moodle,phpbb和WP)。

评论

我投票结束这个问题,因为这是8年前提出的。在WP的最新更新中,此问题已得到解决。

#1 楼

更新:正在记录查询的原因是它不使用索引。查询时间为0,即实际上执行得很快。如果您不想记录这些日志,则可以取消设置“ log-queries-not-using-indexes”选项。

wp_options表在自动加载时没有索引(现在应该是已在2019年8月15日添加到WP核心架构中),因此查询最终会进行全表扫描。通常,该表不应太大,所以这不是问题,但是我猜这在您的情况下是有问题的。在注释中,如果autoload的值不是大多数是,还是在yes和no之间均匀分布,则可能不是:

首先,执行此查询以查看分布情况:

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


如果大多数将其设置为“ no”,则可以通过在自动加载时添加索引来解决该问题。 br />
但是,您可能想弄清楚该表太大的原因。可能是一些写得不好的插件造成了一些麻烦。

评论


我怀疑这种情况下的索引是否会带来任何收益-请查看有关基数的本文。

–TheDeadMedic
2012年11月6日14:50

取决于是否将大多数选项设置为自动加载。我认为不会,但是无论如何桌子上的东西都不应该变得太大,以至于出现了一些可疑之处。

–排行榜
2012年11月6日15:05

我通过回答进行了更新,以增加一些有关检查值分布的信息。

–排行榜
2012年11月6日15:14

我刚刚注意到评论,并意识到我的回答是完全错误的。该查询实际上并不慢……它只是记录在慢查询日志中,因为它不使用索引。

–排行榜
2012年11月6日17:00



由于这个问题和答案,我发现我的wp_options表中有90k条目,其中88.5k设置为autoload false。其余的都是插件添加的“临时”条目(大概是为了缓存?)。将索引添加到autoload列会将mySql负载立即从平均89%降低到2.5%。监视代理显示我的站点的响应时间已从1900ms减少到500ms。这对我来说是一个改变游戏规则的人。


17 Mar 25 '17 3:41

#2 楼

几天前,我偶然发现了运行在服务器上的mytop中提到的查询-实际上,每个查询花费了相当长的时间(约10秒)!因此,在现实世界中,wp_options可能会增长到有问题的大小。就我而言,我怀疑缓存插件Cachify会导致wp_options膨胀。

该wp_options的数据:

,我添加了类似于Vinay Pai发布的解决方案的索引,可以完美地解决该问题。

#3 楼

我的wp_options表只有大约235行数据。我尝试为表建立索引,但无济于事。

结果是,已在表中插入了大约150个临时选项,但并未自动删除。

我不知道它是否相关,但是我一直在浏览我的/var/log/apache2/access.log文件,并注意到有多个(大概是被破坏的)Amazon Web Services服务器(IP地址以54开头.XXX和32.XXX)一直试图利用/~web-root-dir/xmlrpc.php。

经过一些故障排除后,我在wp_options表中查询了包含“ transient”的选项名称。 br />
从wp_options中选择*,其中option_name如'%transient%';

从此查询返回的字段之一是'option_value',其数据类型为LONGTEXT。根据mySQL文档,一个LONGTEXT字段(每行)最多可容纳4 GB的数据。瞬变”)在option_value字段中具有大量数据。查看结果,我还看到了将命令注入wp-cron进程的企图,希望它们将在cron周期内执行。

我的解决方案是删除所有的“瞬态”行。这不会伤害服务器,因为“临时”行将自动重新填充(如果应该存在的话)。

执行此操作后,服务器再次响应。

查询以删除以下行:

从wp_options中删除,其中option_name如'%transient%';

我已将AWS IP地址/ 8超级块添加到防火墙中,也是(-:

评论


是的我也遭受了“ 40秒的加载时间”的困扰,直到发现我有20,000个wp_option记录,其中每个页面都加载了海量数据。删除那些大大加快了站点。

– JasonGenX
19年2月12日在17:34

#4 楼

wp_options表中与自动加载索引字段相关的更新:
WordPress 5.3中的wp_options.autoload已添加了索引。请参阅WordPress 5.3 Changelog
即使您也可以看到wp_options表中的其他列也可以使用索引:
SHOW INDEX from wp_options