2012-05-21 500 views
1

哪個查詢將執行得更快,哪個查詢是完美的?哪個MySQL查詢速度更快?

SELECT 
    COUNT(*) AS count 
FROM 
    students 
WHERE 
    status = 1 
AND 
    classes_id IN(
        SELECT 
         id 
        FROM 
         classes 
        WHERE 
         departments_id = 1 
       ); 

或者

SELECT 
    COUNT(*) AS count 
FROM 
    students s 
LEFT JOIN 
    classes c 
ON 
    c.id = s.classes_id 
WHERE 
    status = 1 
AND 
    c.departments_id = 1 

,我兩次都查詢將輸出相同的結果。現在我想知道哪種方法會更快執行,哪種方法是正確的方法?

+6

當您測試時哪個速度更快? – symcbean

+1

使用'EXPLAIN'運行並自己查看。例子:'解釋select count(*)...' –

+0

解釋你會得到答案 –

回答

5

您應該始終使用EXPLAIN來確定您的查詢將如何運行。

不幸的是,MySQL將執行你的子查詢作爲一個依賴查詢,這意味着子查詢將在外部查詢中的每一行運行。你會認爲MySQL會足夠聰明地檢測到子查詢不是一個相關的子查詢,只會運行一次,唉,它還不夠聰明。因此,MySQL將掃描學生中的所有行,爲每一行運行子查詢,而不使用任何外部查詢上的任何索引。

編寫查詢作爲JOIN將允許MySQL的利用索引,下面的查詢將是最佳的方式來寫它:

SELECT COUNT(*) AS count 
FROMstudents s 
JOIN classes c 
    ON c.id = s.classes_id 
    AND c.departments_id = 1 
WHERE s.status = 1 

這將採用以下指標:

students(`status`) 
classes(`id`, `departements_id`) : multi-column index 
0
兩個查詢

運行EXPLAIN SELECT ...和檢查哪一個做什麼;)

3

從設計和清晰的角度我會避免內選擇喜歡的第一個。的確,如果能夠100%確定每個查詢是否優化以及如何進行優化以及哪個優化運行需要查看您使用的SQL服務器如何將它與它的計