【发布时间】:2012-08-18 13:46:32
【问题描述】:
我想要做的是加快这个查询。目前它慢了大约 15 秒以上。 r.email 和 v.sent 以及 r.id、r.viewed 都有索引和r.saved。 EXPLAIN 显示两个键都在使用中,但我看到它正在使用Using where; Using temporary; Using filesort。
关于改进此查询的任何想法?
SELECT r.id, r.top, r.email
FROM request as r
WHERE r.viewed = 0 AND r.saved = 0 AND r.email NOT IN (
SELECT v.sent FROM viewing as v WHERE v.sent = r.email
)
GROUP BY r.email
ORDER BY r.top desc, r.date
LIMIT 100;
【问题讨论】:
-
这是一个相关的子查询,这意味着它将针对正在考虑的
r的每一行进行评估。尝试改写为普通连接。 -
子查询上的
WHERE条件没有理由存在。如果你删除了它,MySQL 会优化掉子查询,因为它不再依赖于外部查询。