由于查询速度慢而导致 CPU 使用率极高的 Wordpress 网站

Posted

技术标签:

【中文标题】由于查询速度慢而导致 CPU 使用率极高的 Wordpress 网站【英文标题】:Wordpress website with extreme CPU usage due to slow queries 【发布时间】:2020-12-28 12:55:37 【问题描述】:

我正在一个网站上工作,我在该网站上使用高级自定义字段和 woocommerce。我有1800个产品可以由会员创建和编辑(当然每个会员只能编辑自己的产品)。由于每个产品都有大约 40 个自定义字段,因此数据库正在快速增长,并且通过插件“查询监视器”,我发现我为获取这些产品而运行的查询非常慢(0,06 - 0,08)。 我该如何优化呢?我使用redis和OPCache,但是网站很长时间无法访问。

这是我正在运行的查询之一:


SELECT wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp6b_posts.ID = wp_postmeta.post_id )
INNER JOIN wp_postmeta AS mt1
ON ( wp_posts.ID = mt1.post_id )
WHERE 1=1
AND wp_posts.post_author NOT IN (1)
AND ( wp_postmeta.meta_key = 'order_cal'
AND ( ( ( mt1.meta_key = '_product_sub'
AND mt1.meta_value NOT IN ('') ) ) ) )
AND wp_posts.post_type = 'product'
AND ((wp_posts.post_status = 'publish'))
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC

我听说您可以使用索引优化您的表,但在我的具体情况下找不到合适的教程。

在此先感谢,欢迎所有帮助:)

【问题讨论】:

请改正错字:wp6b_posts. 【参考方案1】:

对于wp_postmeta

INDEX(post_id, meta_key)

更多详情请参见:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

【讨论】:

【参考方案2】:

您需要在 SQL 中创建和索引,请检查以下索引并在添加后运行您的查询。

  ALTER TABLE `wp_postmeta` ADD INDEX `wp_postmeta_idx_meta_key_post_id_meta_value` (`meta_key`,`post_id`,`meta_value`);
    ALTER TABLE `wp_posts` ADD INDEX `wp_posts_idx_post_type_post_statu_post_autho` (`post_type`,`post_status`,`post_author`);
    ALTER TABLE `wp_posts` ADD INDEX `wp_posts_idx_post_type_post_statu_id` (`post_type`,`post_status`,`ID`);

【讨论】:

以上是关于由于查询速度慢而导致 CPU 使用率极高的 Wordpress 网站的主要内容,如果未能解决你的问题,请参考以下文章

以极高的速度获取行

RAID 10是将RAID 1和RAID 0结合

RAID磁盘阵列之RAID 10

Oracle查询语句导致CPU使用率过高问题处理

mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高

一级缓存和二级缓存有啥区别