【发布时间】:2010-10-10 00:43:24
【问题描述】:
我使用的查询通常在一秒钟内执行,但有时需要 10-40 秒才能完成。我实际上并不完全清楚子查询是如何工作的,我只知道它可以工作,因为它为每个 faverprofileid 提供了 15 行。
我正在记录慢速查询,它告诉我检查了 5823244 行,这很奇怪,因为在所涉及的任何表中都没有接近那么多行(收藏夹表最多有 50,000 行)。
谁能给我一些建议?是子查询的问题,需要使用文件排序吗?
编辑:运行解释表明 users 表没有使用索引(即使 id 是主键)。在额外下它说:使用临时;使用文件排序。
SELECT F.id,F.created,U.username,U.fullname,U.id,I.*
FROM favorites AS F
INNER JOIN users AS U ON F.faver_profile_id = U.id
INNER JOIN items AS I ON F.notice_id = I.id
WHERE faver_profile_id IN (360,379,95,315,278,1)
AND F.removed = 0
AND I.removed = 0
AND F.collection_id is null
AND I.nudity = 0
AND (SELECT COUNT(*) FROM favorites WHERE faver_profile_id = F.faver_profile_id
AND created > F.created AND removed = 0 AND collection_id is null) < 15
ORDER BY F.faver_profile_id, F.created DESC;
【问题讨论】:
-
如果您将“select”、“from”、“where”、“and”、“in”和“order by”关键字用小写字母和“inner”编写,您可以获得更好的语法着色"、"join"、"on" 和 "desc",只有第一个大写字母。
-
您是否尝试为 created 排序的每个 faver_profile_id 选择前 15 个项目?
-
您是否在表格上运行过 ANALYZE?
-
用户表未使用索引,收藏夹使用“已删除”索引而不是 faver_profile_id。出于某种原因,删除“已删除”索引(我并不真正需要)解决了这两个问题。我也切换到 GROUP BY 和 HAVING 并且查询现在运行得非常快。谢谢!
标签: mysql performance subquery cbo