【问题标题】:how to get better performance, with not in query如何在不查询的情况下获得更好的性能
【发布时间】:2018-01-26 13:00:26
【问题描述】:

这是我的自定义 sql 查询;

SELECT id,
       post_title,
       post_content,
       comment_count,
       post_date,
       post_status,
       post_name
FROM   wp_posts
WHERE  post_type = 'post'
       AND post_status = 'publish'
       AND id NOT IN (SELECT DISTINCT post_id
                      FROM   wp_postmeta
                      WHERE  meta_key = 'visible_headlane'
                             AND meta_value = 'On')
       AND id NOT IN (SELECT DISTINCT post_id
                      FROM   wp_postmeta
                      WHERE  meta_key = 'visible_homepage'
                             AND meta_value = 'On')
ORDER  BY post_date DESC
LIMIT  11, 32  

我不能用,LIMIT in NOT IN Query 所以,有什么方法可以使用,或者限制SELECT DISTINCT sql 查询,或者有什么想法?

注意:我需要优化这个查询,因为它需要很长时间,就像一个慢查询。

谢谢。

【问题讨论】:

  • 或许可以通过 LEFT JOIN 结合 IS NULL 而不是 NOT IN。
  • 我会尝试一些,现在左加入,任何人都有更多的例子或想法。 ?

标签: mysql sql wordpress mariadb


【解决方案1】:

切换到NOT EXISTS( SELECT 1 FROM ... )——这种变体不需要计算整个事物列表;它只需要检查是否缺席。 LEFT JOIN .. ON .. IS NULL 效率也更高。

此外,wp_postmeta 的标准模式效率很低;见我的suggestions

同时,将其保留为两个测试,与“持有人”的建议不同。

EXISTS 看起来像

AND NOT EXISTS ( SELECT 1 FROM wp_postmeta
                    WHERE post_id = wp_posts.id
                      AND meta_key = 'visible_headlane'
                      AND meta_value = 'On' )

这将充分利用我推荐的PRIMARY KEY(post_id, meta_key)

(真的是“头条”,而不是“头条”吗?)

【讨论】:

  • 感谢您的聪明回答。祝你快乐@rick james
【解决方案2】:

也许像 jarlh 建议的那样

SELECT 
ID,post_title,post_content,comment_count,post_date,post_status,post_name
FROM wp_posts t1
left join  (
SELECT DISTINCT post_id from wp_postmeta
WHERE meta_key IN ('visible_headlane','visible_homepage') AND meta_value = 'On' ) t2 on t1.ID = t2.post_id

WHERE post_type = 'post'
AND post_status = 'publish'
AND t2.post_id is null
ORDER BY post_date DESC
LIMIT 11, 32

【讨论】:

  • 它的好机器人并不是真的更好,它再次需要 15.6 毫秒的执行时间。
  • 还添加了,LIMIT需要13毫秒; left join ( SELECT DISTINCT post_id from wp_postmeta WHERE meta_key IN ('visible_headlane','visible_homepage') AND meta_value = 'On' order by post_id DESC LIMIT 11,32) t2 on t1.ID = t2.post_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2010-11-03
  • 2012-12-17
相关资源
最近更新 更多