首页 > 解决方案 > wp_posts 上的 Wordpress 慢查询

问题描述

我们有一个带有 wp_posts 中 200 万条记录的数据库的 wordpress,新的遗物表明我们有几个慢查询,但这个正在占用

 SELECT wp_posts.ID 
 FROM wp_posts  
 WHERE ?=?  AND wp_posts.post_type = ? AND ((wp_posts.post_status = ?))  ORDER BY wp_posts.post_title ASC 
 LIMIT ?, ? 

它正在解释这一点:

在此处输入图像描述

我不知道如何优化这个查询,但我想我需要添加一个索引(id、post_type、post_status 和 post_title)?

标签: mysqlwordpressperformance

解决方案


你需要的是INDEX(type, status, title, ID). 但这行不通,因为索引中不能有TEXT(如post_title)列。

所以没有优化也没有有用的索引。

WP 不是按比例设计的。postmeta2M 行已经很多了,尽管没有加入到其他表时那么糟糕。

这个查询需要收集所有某种类型和状态的标题,排序,跳过OFFSET,最后传递一些ID。

如果您OFFSET因为“分页”而使用,那么您还有第二个问题——当用户翻阅列表时,查询会越来越慢。(注意我提到的“跳过”步骤。)

如果您可以将标题限制在 255 个以下(或者可能是 191 个,取决于版本和字符集)字符,那么INDEX我提到的将起作用,并且它会工作得更快。如果任何标题被截断,这将涉及并ALTER TABLE更改post_titleVARCHAR(...)需要一些时间并丢失数据。

一个可能的解决方案......由于向用户提供 2M 行是不合理的,我们可以猜测type和/或status相当有选择性吗?也就是说,真的最多只有几百行感兴趣吗?在这种情况下,这可能会有所帮助:

INDEX(post_type, post_status) -- in either order.

推荐阅读