mysql-group by原理

執行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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章