我们有一个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 ?, ?
它正在解释这一点:
我不知道该如何优化此查询,但我想我需要添加一个索引(id,post_type,post_status和post_title)?
答案 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.