Wp_options表的查询速度较慢

时间:2012-11-06 作者:Prasad Ajinkya

我一直在跟踪基于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\';
我不明白这么小的表怎么会花这么多时间来执行。这只是其他问题的症状吗?(当前在专用VM上运行Moodle、phpbb和WP)。

4 个回复
最合适的回答,由SO网友:Vinay Pai 整理而成

Update: 记录查询的原因是doesn\'t use an index. 查询时间为0,即它实际上执行得很快。如果不想记录这些查询,可以取消设置“不使用索引记录查询”选项。

wp\\U选项表在自动加载上没有索引(it now should, 它被添加到WP核心模式(2019年8月15日),因此查询最终会进行完整的表扫描。总的来说,这个表不应该太大,所以这不是问题,但我猜在你的情况下可能会发生这种情况。

添加索引可能会解决问题,但正如HeadMedic在评论中指出的那样,如果autoload的值是多数是,或者在是和否之间均匀分布,则可能无法解决问题:

首先,执行此查询以查看分发的外观:

SELECT COUNT(*), autoload FROM wp_options GROUP BY autoload;
如果大多数设置为“否”,则可以通过在自动加载上添加索引来暂时解决问题。

ALTER TABLE wp_options ADD INDEX (`autoload`);
然而,您可能想弄清为什么该表变得太大。可能是某个写得不好的插件做了一些可疑的事情。

SO网友:Jan Papenbrock

几天前,我在我的服务器上偶然发现了mytop中提到的查询,实际上每个查询都要花费相当长的时间(大约10秒)!因此,在现实世界中,wp\\U选项的大小可能会出现问题。就我而言,我怀疑缓存插件Cachify 负责膨胀wp\\U选项。

此特定wp\\U选项的数据:

5,309 rows
130MB of data
作为解决方案,我添加了与Vinay Pai发布的解决方案类似的索引,完美地解决了问题。

SO网友:Ex_Military

我的wp\\u options表只有大约235行数据。我试着给表编制索引,但没有用。

结果表明,大约有150个临时选项已插入到表中,但尚未自动删除。

我不知道它是否相关,但我一直在查看我的/var/log/apache2/access。并注意到多个亚马逊Web服务服务器(IP地址从54.X.X.X和32.X.X.X开始)试图利用/~ Web根目录/xmlrpc进行攻击。php。

经过一些故障排除,我在wp\\U选项表中查询包含“transient”的选项名称

从wp\\u options中选择*,其中option\\u名称类似“%”transient“%”;

此查询返回的字段之一是“option\\u value”,其数据类型为LONGTEXT。根据mySQL文档,一个长文本字段(每行)最多可以容纳4G字节的数据。

当我执行查询时,option\\u value字段中的一些行(记住是处理那些包含“transient”的行)有大量数据。通过查看结果,我还看到了向wp cron进程中注入命令的尝试,希望这些命令能够在cron周期中执行。

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

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

查询以删除这些行:

从wp\\u options中删除,其中option\\u名称类似“%”transient“<em>%”;

我也将AWS IP地址/8个超级块添加到了防火墙(-:

SO网友:Deepak Rajpal

Update related to Index for autoload field in wp_options table:

已将索引添加到wp\\U选项中。在WordPress 5.3中自动加载。看见WordPress 5.3 Changelog

即使您可以看到索引也可用于wp\\U选项表中的其他列:

SHOW INDEX from wp_options

结束