使用ORDER BY时查询速度慢

这里是查询(最大的表约有40,000行)

SELECT Course.CourseID, Course.Description, UserCourse.UserID, UserCourse.TimeAllowed, UserCourse.CreatedOn, UserCourse.PassedOn, UserCourse.IssuedOn, C.LessonCnt FROM UserCourse INNER JOIN Course USING(CourseID) INNER JOIN ( SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID ) C USING(CourseID) WHERE UserCourse.UserID = 8810 

如果我运行它,它执行速度非常快(大约.05秒)。 它返回13行。

当我在查询的末尾添加ORDER BY子句(按任意列sorting)时,查询大约需要10秒。

我现在在生产中使用这个数据库,并且一切工作正常。 我所有的其他查询都很快。

任何想法可能是什么? 我在MySQL的查询浏览器中,从命令行运行查询。 ORDER BY这两个地方都很慢。

编辑: Tolgahan ALBAYRAK解决scheme的作品,但任何人都可以解释为什么它的作品?

也许这有助于:

 SELECT * FROM ( SELECT Course.CourseID, Course.Description, UserCourse.UserID, UserCourse.TimeAllowed, UserCourse.CreatedOn, UserCourse.PassedOn, UserCourse.IssuedOn, C.LessonCnt FROM UserCourse INNER JOIN Course USING(CourseID) INNER JOIN ( SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID ) C USING(CourseID) WHERE UserCourse.UserID = 8810 ) ORDER BY CourseID 

您是按索引sorting的列吗?

索引大大加快了订购和过滤。

实现答案为时已晚,但是我刚刚有一个类似的问题,通过增加查询时间从几秒钟增加到5分钟,并尝试了大多数其他的build议,加快了速度,注意到/ tmp文件得到12G这个查询。 改变了查询,使返回的varchar(20000)字段“修剪(”编辑和性能显着改善(回秒)。所以我想它值得检查你是否返回大的变化作为你的查询的一部分,如果是这样,处理它们(可能是substring(x,1,length(x))??如果你不想修剪它们。Query返回500k行,/ tmp文件指出每行使用大约20k的数据。

您正在从“ UserCourse ”中select,我假设它是课程和用户(多对多)之间的连接表。 您应该在“UserCourse”表中索引您需要订购的列。

假设你想“ 按CourseIDsorting ”,那么你需要在UserCourse表上索引它。

在连接表(即UserCourse)中不存在的任何其他列的sorting可能需要在连接表上进一步非规范化和索引以针对速度进行优化; 换句话说,您需要在连接表中拥有该列的副本并将其编入索引。

PS Tolgahan Albayrak给出的答案虽然对于这个问题是正确的,但是在一个正在做“LIMIT x”查询的情况下,不会产生所需的结果。

你有更新数据库的统计数据吗? 我遇到了类似的问题,我有两个相同的查询,其中唯一的区别是大写字母,一个在1/2秒内返回,另一个差不多需要5分钟。 更新统计数据解决了问题

在这之前有一个类似的问题。

它也可以帮助你。 基本上它描述了使用复合索引以及按工作顺序。

今天我遇到了同样的问题。 只要我从一个连接表中的字段sorting结果集,整个查询是非常缓慢,花了一百多秒。

服务器运行的是MySQL 5.0.51a,偶然我发现,同样的查询运行的速度应该总是在MySQL 5.1的服务器上完成。 当比较说明这个查询时,我看到显然索引的使用和处理已经改变了很多(至less从5.0 – > 5.1)。

所以如果你遇到这样的问题,也许你的解决scheme是简单地升级你的MySQL