執行GROUP BY子句的最一般的方法:先掃描整個表,然後創建一個新的臨時表,表中每個組的所有行應爲連續的,最後使用該臨時表來找到組
並應用聚集函數。在某些情況中,MySQL通過訪問索引就可以得到結果,此類查詢的 EXPLAIN 輸出顯示 Extra 列的值爲 Using index for group-by。
使用鬆散(Loose)索引掃描實現 GROUP BY
MySQL 完全利用索引掃描來實現GROUP BY ,並不需要掃描所有滿足條件的索引鍵即可完成操作得出結果。
Extra信息中顯示:Using index for group-by 要利用到鬆散索引掃描實現 GROUP BY,需要至少滿足以下幾個條件:
◆GROUP BY 條件字段必須在同一個索引中最前面的連續位置;
◆在使用GROUP BY 的同時,只能使用 MAX 和 MIN 這兩個聚合函數;
◆如果引用到了該索引中 GROUP BY 條件之外的字段條件的時候,必須以常量形式存在; 鬆散索引掃描需要讀取的鍵值數量與分組的數量一樣多,儘可能讀取最少數量的關鍵字。
使用緊湊(Tight)索引掃描實現 GROUP BY
和鬆散索引掃描的區別是需要讀取所有滿足條件的索引值,之後取數據完成操作。
Extra中不顯示for group-by 在 MySQL 中,首先會選擇嘗試通過鬆散索引掃描來實現 GROUP BY 操作,當發現某些情況無法滿足鬆散索引掃描實現 GROUP BY 的要求之後,纔會嘗試通過緊湊索引掃描來實現。(比如GROUP BY 條件字段並不連續或者不是索引前綴部分的時候)
使用臨時表實現 GROUP BY
當無法找到合適的索引可以利用的時候,就不得不先讀取需要的數據,然後通過臨時表來完成 GROUP BY 操作。
Extra:Using temporary; Using filesort