2015-09-22 18 views
0

我有一張桌子,還有第二本書。我正在嘗試獲取學生名單以及他們擁有的書籍數量。如何改進MySQL中的SELECT子查詢?

"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。我該如何提高性能?謝謝。

+0

子查詢中是否需要DISTINCT?這可能不利於任何表現。如果書籍中的記錄是基於studentID和id的唯一記錄,那麼我認爲你不需要它。我也不完全確定你需要子查詢,但我必須測試它。似乎你可能只是直接將書籍加入到學生中,按學生ID和姓名分組,然後統計書籍ID。 –

回答

1

改變,要

"SELECT 
    StudentID, 
    FullName, 
    (SELECT 
     COUNT(id) 
    FROM 
     books 
    where books.StudentID = students.StudentID 
    ) AS book_count 
FROM 
    students 
ORDER BY 
    students.FullName ASC 
LIMIT 0, 30;" 

的全名添加索引學生列 和StudentID書籍表。

1

試試這個:

SELECT StudentID, FullName,COUNT(books.id) AS book_count 
FROM students 
LEFT JOIN books ON books.StudentID = students.StudentID 
GROUP BY StudentID 
ORDER BY students.FullName ASC 
LIMIT 0, 30; 
+0

這很有效,但它不會返回沒有任何書的學生。 –

+1

我做了一個測試,如果沒有的話,它會在book_count中返回一個1。您可以將COUNT(*)替換爲COUNT(books.id),並且在沒有任何書籍時將其替換爲0 –

+0

實際上,它按預期工作,比我的原始查詢快得多,但沒有書的學生是返回爲有1本書而不是0.謝謝你,儘管如此。 –