Mysql wordpress对Posteta的慢速查询

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

这是我的网站加载几乎需要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)
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需要一些改进的索引。看

唯一的区别是:分组依据+订单依据+限额?