【发布时间】:2015-09-22 20:25:01
【问题描述】:
我有一个学生表和第二个能书。我正在尝试获取学生列表以及他们拥有的书籍数量。
"SELECT
StudentID,
FullName,
book_count.ct
FROM
students
LEFT JOIN (
SELECT
StudentID,
COUNT(DISTINCT id) AS ct
FROM
books
GROUP BY
StudentID
) AS book_count
ON
book_count.StudentID = students.StudentID
ORDER BY
students.FullName ASC
LIMIT 0, 30;
这个查询大约需要 6 秒的时间来运行,并且随着书籍的增加,它会变得越来越慢。查看查询配置文件 > 90% 的时间是花在“复制到临时表”上。问题是我的子选择查询获取书籍搜索的计数并总计整个书籍表,无论我可能查找多少学生,在我的情况下为 30。我该如何提高这方面的性能?谢谢。
【问题讨论】:
-
子查询中是否需要 DISTINCT?这可能对性能没有任何帮助。如果书籍中的记录基于 studentID 和 id 是唯一的,那么我认为您不需要它。我也不完全确定您是否需要子查询,但我必须对其进行测试。似乎您可以直接将书籍加入学生,按学生 ID 和姓名分组,然后计算书籍 ID。
标签: mysql subquery query-performance