Mysql wordpress对Posteta的慢速查询
这是我的网站加载几乎需要2分钟的两个查询Mysql wordpress对Posteta的慢速查询,mysql,wordpress,Mysql,Wordpress,这是我的网站加载几乎需要2分钟的两个查询 SELECT COUNT(*) FROM wp8k_posts LEFT JOIN wp8k_postmeta ON (wp8k_posts.ID = wp8k_postmeta.post_id AND wp8k_postmeta.meta_key = 'rate') LEFT JOIN wp8k_postmeta AS mt1 ON (wp8k_posts.ID = mt1.post_id) WH
SELECT COUNT(*)
FROM wp8k_posts
LEFT JOIN wp8k_postmeta ON (wp8k_posts.ID = wp8k_postmeta.post_id
AND wp8k_postmeta.meta_key = 'rate')
LEFT JOIN wp8k_postmeta AS mt1 ON (wp8k_posts.ID = mt1.post_id)
WHERE 1 = 1
AND (wp8k_postmeta.post_id IS NULL
OR mt1.meta_key = 'rate')
AND wp8k_posts.post_type = 'post'
AND (wp8k_posts.post_status = 'publish'
OR wp8k_posts.post_status = 'private')
另一个是
SELECT wp8k_posts.ID
FROM wp8k_posts
LEFT JOIN wp8k_postmeta ON (wp8k_posts.ID = wp8k_postmeta.post_id
AND wp8k_postmeta.meta_key = 'rate')
LEFT JOIN wp8k_postmeta AS mt1 ON (wp8k_posts.ID = mt1.post_id)
WHERE 1 = 1
AND (wp8k_postmeta.post_id IS NULL
OR mt1.meta_key = 'rate')
AND wp8k_posts.post_type = 'post'
AND (wp8k_posts.post_status = 'publish'
OR wp8k_posts.post_status = 'private')
GROUP BY wp8k_posts.ID
ORDER BY wp8k_postmeta.meta_value + 0 DESC
LIMIT 32, 16
有没有办法让我的网站不会因为这些查询而花费将近2分钟的时间加载。这似乎与您的查询相当:
SELECT p.ID
FROM wp8k_posts AS p
LEFT JOIN wp8k_postmeta AS a ON p.ID = a.post_id
AND a.meta_key = 'rate'
LEFT JOIN wp8k_postmeta AS b ON p.ID = b.post_id
WHERE ( a.post_id IS NULL
OR b.meta_key = 'rate'
)
AND p.post_type = 'post'
AND p.post_status IN ( 'publish', 'private' )
GROUP BY p.ID
ORDER BY a.meta_value+0 DESC
LIMIT 32, 16
令人困惑的是,两个左连接似乎在寻找同一列,但方式不同:
ON ... a.meta_key = 'rate'
WHERE ( a.post_id IS NULL
OR b.meta_key = 'rate' )
但更令人困惑的是,您要求缺少a
,但却按a.meta\u值+0进行排序。因此,该值将始终为空,因此可以删除orderby
。(或者修复查询的其余部分。)因为这是a
的唯一用途,所以可以删除整个左连接a
SELECT p.ID
FROM wp8k_posts AS p
WHERE p.post_type = 'post'
AND p.post_status IN ( 'publish', 'private' )
GROUP BY p.ID
LIMIT 32, 16
查询根本不使用b
,因此可以完全删除左连接
结果是没有订单的限制,这通常是没有意义的
这应该给出相同的结果,只是它可能是不同的16行。而且它应该同样快,因为我认为,有一个以开头的索引(post\u type,post\u status)
解决方案?
你显然想用rate
做点什么
- 不要两次加入Posteta,寻找相同的“费率”
- 不要使用
LEFT
,除非您希望有一些行没有指定速率
- 如果您只需要具有“rate”的行,那么Posteta需要一些改进的索引。看
唯一的区别是:分组依据+订单依据+限额?