【问题标题】:wordpress slow query for postmetapostmeta的wordpress慢查询
【发布时间】:2021-05-25 03:03:03
【问题描述】:

这些是我的网站加载需要将近 2 分钟的 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 分钟。

【问题讨论】:

  • 唯一的区别是:GROUP BY + ORDER BY + LIMIT 吗?

标签: mysql wordpress


【解决方案1】:

这似乎等同于您的查询:

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 

令人困惑的是,两个 LEFT JOIN 似乎都在寻找同一列,但方式不同:

    ON ...   a.meta_key = 'rate' 
    WHERE  ( a.post_id IS NULL
         OR  b.meta_key = 'rate' )

但更令人困惑的是,您要求a 丢失,但执行ORDER BY a.meta_value+0。因此,它始终为 NULL,因此可以删除 ORDER BY。 (或修复查询的其余部分。)因为这是 a 的唯一用途,所以可以删除整个 LEFT JOIN 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,所以LEFT JOIN可以全部去掉。

结果是没有 ORDER BY 的 LIMIT,这通常没有意义。

这应该给出相同的结果,除了它可能是不同的 16 行。它应该一样快,因为我认为有一个以(post_type, post_status) 开头的索引。

解决方案?

你显然想对rate做点什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2021-04-28
    • 2019-07-17
    • 2012-01-15
    相关资源
    最近更新 更多