mysql group原理_MySQL Group By 实现原理分析
【IT168 專稿】由于 GROUP BY 實際上也同樣會進行排序操作,而且與 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分組操作。當然,如果在分組的時候還使用了其他的一些聚合函數,那么還需要一些聚合函數的計算。所以,在GROUP BY 的實現過程中,與 ORDER BY 一樣也可以利用到索引。
在 MySQL 中,GROUP BY 的實現同樣有多種(三種)方式,其中有兩種方式會利用現有的索引信息來完成 GROUP BY,另外一種為完全無法使用索引的場景下使用。下面我們分別針對這三種實現方式做一個分析。
1.使用松散(Loose)索引掃描實現 GROUP BY
何謂松散索引掃描實現 GROUP BY 呢?實際上就是當 MySQL 完全利用索引掃描來實現 GROUP BY 的時候,并不需要掃描所有滿足條件的索引鍵即可完成操作得出結果。
下面我們通過一個示例來描述松散索引掃描實現 GROUP BY,在示例之前我們需要首先調整一下 group_message 表的索引,將 gmt_create 字段添加到 group_id 和 user_id 字段的索引中:
1 sky@localhost: example08:49:45>createindexidx_gid_uid_gc2 3 ->ongroup_message(group_id,user_id,gmt_create);4 5 Query OK, rows affected (0.03sec)6 7 Records:96Duplicates:0Warnings:08 9 sky@localhost: example09:07:30>dropindexidx_group_message_gid_uid10 11 ->ongroup_message;12 13 Query OK,96rows affected (0.02sec)14 15 Records:96Duplicates:0Warnings:0
然后再看如下 Query 的執行計劃:
1 sky@localhost: example09:26:15>EXPLAIN2 3 ->SELECTuser_id,max(gmt_create)4 5 ->FROMgroup_message6 7 ->WHEREgroup_id<108 9 ->GROUPBYgroup_id,user_id\G10 11 ***************************1. row***************************12 13 id:114 15 select_type: SIMPLE16 17 table: group_message18 19 type: range20 21 possible_keys: idx_gid_uid_gc22 23 key: idx_gid_uid_gc24 25 key_len:826 27 ref:NULL28 29 rows:430 31 Extra: Usingwhere; Usingindexforgroup-by32 33 1rowinset(0.00sec)
我們看到在執行計劃的 Extra 信息中有信息顯示“Using index for group-by”,實際上這就是告訴我們,MySQL Query Optimizer 通過使用松散索引掃描來實現了我們所需要的 GROUP BY 操作。
下面這張圖片描繪了掃描過程的大概實現:
要利用到松散索引掃描實現 GROUP BY,需要至少滿足以下幾個條件:
◆GROUP BY 條件字段必須在同一個索引中最前面的連續位置;
◆在使用GROUP BY 的同時,只能使用 MAX 和 MIN 這兩個聚合函數;
◆如果引用到了該索引中 GROUP BY 條件之外的字段條件的時候,必須以常量形式存在;
為什么松散索引掃描的效率會很高?
因為在沒有WHERE子句,也就是必須經過全索引掃描的時候, 松散索引掃描需要讀取的鍵值數量與分組的組數量一樣多,也就是說比實際存在的鍵值數目要少很多。而在WHERE子句包含范圍判斷式或者等值表達式的時候, 松散索引掃描查找滿足范圍條件的每個組的第1個關鍵字,并且再次讀取盡可能最少數量的關鍵字。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql group原理_MySQL Group By 实现原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装饰工程备案需要哪些资料(装饰工程备案)
- 下一篇: 非安卓手机(安卓与或非)