繁体   English   中英

如何在不查询的情况下获得更好的性能

[英]how to get better performance, with not in query

这是我的自定义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在NOT IN Query中,所以,有什么方法可以使用,或者限制SELECT DISTINCT sql查询,或者有什么想法?

注意:我需要优化此查询,因为它要花很长时间,就像慢速查询一样。

谢谢。

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

此外,wp_postmeta的标准架构效率很低。 看我的建议

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

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)

(真的是“标题”而不是“标题”吗?)

也许像贾尔建议的那样

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM