如何在NOT IN中使用数百个值来优化慢查询?

时间:2018-02-14 22:22:38

标签: mysql wordpress percona

我有两个以下两个Wordpress查询,我使用Query Monitor插件来识别这个查询真的很慢。

wp_posts表中只有不到2400行。

服务器有2个内核,平均负载大约为0.5

我正在使用mysql -V给我的Percona服务器:

mysql  Ver 14.14 Distrib 5.7.20-19, for Linux (x86_64) using  6.2

NOT IN部分始终相同,有大约400项要排除,最多可以达到1000

有没有办法优化查询或使用index来提高效果?

或者是否有更好的方法可以使帖子排除更有效率?

SELECT wp_posts.*, (t1.meta_value+0.00) AS ratings_average, (t2.meta_value+0.00) AS ratings_users
FROM wp_posts 
LEFT JOIN wp_postmeta AS t1
ON t1.post_id = wp_posts.ID
AND t1.meta_key = 'ratings_score'
LEFT JOIN wp_postmeta As t2
ON t1.post_id = t2.post_id
AND t2.meta_key = 'ratings_users'
WHERE 1=1 
AND wp_posts.ID NOT IN (123,234,345,456,567,678,789,890)
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private') 
ORDER BY ratings_average desc, ratings_users desc
LIMIT 0, 12

SELECT p.ID AS id, p.post_title AS title, p.post_author AS uid, SUM(v.pageviews) AS pageviews
FROM `wp_popularpostssummary` v
LEFT JOIN `wp_posts` p
ON v.postid = p.ID
WHERE 1 = 1
AND p.post_type IN('post', 'page')
AND p.ID NOT IN(123,234,345,456,567,678,789,890)
AND v.view_datetime > DATE_SUB('2018-02-15 05:48:36', INTERVAL 29 DAY)
AND p.post_password = ''
AND p.post_status = 'publish'
GROUP BY v.postid
ORDER BY pageviews DESC
LIMIT 12 OFFSET 0;

1 个答案:

答案 0 :(得分:1)

尝试将值存储在表中,并加入其中,或将其值作为NOT IN列表的子查询。

...
FROM wp_posts AS p
LEFT JOIN wp_posts_flagged AS f ON p.ID = f.ID -- optionally: AND f.flag_type = X
...
WHERE f.ID IS NULL
...

WHERE p.ID NOT IN (SELECT ID FROM wp_posts_flagged)