24

这是查询(最大的表有大约 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

如果我运行它,它会执行得非常快(大约 0.05 秒)。它返回 13 行。

当我ORDER BY在查询末尾添加一个子句(按任何列排序)时,查询大约需要 10 秒。

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

关于它可能是什么的任何想法?我在 MySQL 的查询浏览器和命令行中运行了查询。这两个地方都非常缓慢ORDER BY

编辑: Tolgahan ALBAYRAK 解决方案有效,但谁能解释它为什么有效?

4

7 回答 7

18

也许这有帮助:

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
于 2009-05-19T19:45:50.880 回答
7

您按索引排序的列是否已编入索引?

索引大大加快了排序和过滤。

于 2009-05-19T19:45:05.377 回答
3

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

假设您要“按 CourseID 排序”,那么您需要在UserCourse表中对其进行索引。

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

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

于 2016-02-22T10:46:20.160 回答
1

您是否更新了数据库中的统计信息?我遇到了类似的问题,我有 2 个相同的查询,唯一的区别是一个大写字母,一个以 1/2 秒的速度返回,另一个花了将近 5 分钟。更新统计信息解决了问题

于 2009-05-19T19:47:24.137 回答
1

意识到答案为时已晚,但是我刚刚遇到了类似的问题,通过将查询时间从几秒增加到 5 分钟来添加订单并尝试了大多数其他加快速度的建议,注意到 /tmp 文件的大小为 12G这个查询。更改了查询,使得返回的 varchar(20000) 字段是“trim(”ed 并且性能显着提高(回到秒)。所以我想值得检查一下您是否在查询中返回大型 varchars,如果是,处理它们(也许是 substring(x, 1, length(x))?? 如果你不想修剪它们。查询返回 500k 行,/tmp 文件表明每行使用大约 20k 数据。

于 2012-08-17T12:03:14.293 回答
0

之前在这里问过一个类似的问题

它也可能对您有所帮助。基本上它描述了使用复合索引以及 order by 的工作原理。

于 2009-05-19T19:57:16.363 回答
0

今天我遇到了同样的问题。当我按连接表中的字段对结果集进行排序时,整个查询速度非常慢,耗时超过 100 秒。

该服务器运行的是 MySQL 5.0.51a,我偶然注意到,相同的查询运行速度与它在使用 MySQL 5.1 的服务器上的运行速度一样快。在比较该查询的解释时,我发现索引的使用和处理显然发生了很大变化(至少从 5.0 -> 5.1)。

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

于 2011-09-29T14:29:01.113 回答