WordPress在wp_posts上的慢查询

时间:2019-02-24 02:40:42

标签: mysql wordpress performance

我们有一个wordpress,数据库中wp_posts中有200万条记录,新的记录显示我们有几个慢查询,但是这个查询正在接受

 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 ?, ? 

它正在解释这一点:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

因此没有优化,也没有有用的索引。

WP并非按比例设计。 2M行很多,虽然还不如加入postmeta或其他表那样糟糕。

此查询需要收集某种类型和状态的所有标题,对其进行排序,跳过OFFSET,最后提供一些ID。

如果由于“分页”而使用OFFSET,那么您还有第二个问题-随着用户分页浏览列表,查询的速度将越来越慢。 (请注意我提到的“跳过”步骤。)

如果您可以将标题限制为255个以下字符(或191个字符,具体取决于版本和字符集),那么我提到的INDEX将起作用,并且它将更快地工作。这将涉及到ALTER TABLE并将post_title更改为VARCHAR(...),这将花费一些时间,如果任何标题被截断,则会丢失数据。

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

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