2016-07-15 100 views
2

MySQL版本 - 5.5.39含內優化選擇查詢加入

我有這兩個表BugsBugStatus

我想給定用戶獲取OpenClosed的bug數量。

我目前使用此查詢

SELECT BugStatus.name, 
    count(BugStatus.name) AS count 
FROM bugs 
INNER JOIN BugStatus ON bugs.status = bugstatus.id 
WHERE bugs.assignee='irakam' 
GROUP BY bugstatus.name; 

現在讓我們假設我要在我的Bugs表100,000行。這個查詢是否仍然存在,或者我應該如何修改它。我確實使用了Explain,但我仍然感到困惑。那麼這個查詢可以優化嗎?

SQLFiddle鏈接 - Click here

回答

1
Select bs.name, 
     count(*) as count -- simply count(*) unless you are avoiding nulls 
    from bugs 
    inner join BugStatus AS bs ON bugs.status = bs.id 
    where bugs.assignee='irakam' 
    group by bs.name; 

bugs: INDEX(assignee) -- since filtering occurs first 

Index Cookbook

1

您可以進一步通過創建bugs.status和bugs.assignee索引優化表:據

CREATE INDEX idx_bugs_assignee_status on bugs(assignee, status);

作爲執行計劃:

選擇類型:簡單

這意味着你正在執行一個簡單的查詢,沒有任何的子查詢或工會。

類型:所有

這意味着,你正在做一個全表掃描被在錯誤狀態表完成(每行檢查),應避免大的表,但是這對於BugStatus表是可以的,因爲它只包含2行。

類型:REF

這意味着與匹配的索引值的所有行從錯誤表被讀出,用於BugStatus找到的行的每個組合。

possible_keys

此列出了可能用來回答您的查詢可能指數(BugStatus的主鍵,並在bugs.status外鍵)

關鍵

這是優化程序選擇回答您的查詢的實際索引(在BugStatus表的情況下,無sinc e正在對其執行全表掃描,並且在錯誤表的情況下處於外鍵狀態。)

REF

這表明,使用上的連接表以比較結果的索引。

此列表示被檢驗的行的數目。

extra:Using temporary;使用filesort

'使用臨時'意味着mysql需要創建一個臨時表來排序結果,這是因爲您的GROUP BY子句完成的。 '使用filesort'這意味着數據庫必須對您的結果執行另一個傳遞以找出如何檢索排序的行。

額外:使用哪裏

意味着你在查詢中有一個WHERE子句。

參見:https://dev.mysql.com/doc/refman/5.5/en/explain-output.html