【发布时间】:2018-02-14 22:22:38
【问题描述】:
我有两个以下两个 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;
【问题讨论】:
-
您是否尝试过将这些
not in值放在一个表中并改用它? ...但我不禁注意到,这似乎是矛盾的“NOT IN 部分总是相同的,大约有 400 项要排除,可能多达 1000 项” -
-
在任何代码中拥有不断变化的 ID 值列表并不是一个好主意。