亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL分組查詢Group By實現原理詳解

2024-07-24 13:09:39
字體:
來源:轉載
供稿:網友

由于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 字段的索引中:

sky@localhost: example 08:49:45> create index idx_gid_uid_gc -> on group_message(group_id,user_id,gmt_create); Query OK, rows affected (0.03 sec) Records: 96 Duplicates: 0 Warnings: 0sky@localhost: example 09:07:30> drop index idx_group_message_gid_uid -> on group_message; Query OK, 96 rows affected (0.02 sec) Records: 96 Duplicates: 0 Warnings: 0

然后再看如下 Query 的執行計劃:

sky@localhost: example 09:26:15> EXPLAIN -> SELECT user_id,max(gmt_create) -> FROM group_message -> WHERE group_id < 10 -> GROUP BY group_id,user_id/G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: group_message type: range possible_keys: idx_gid_uid_gc key: idx_gid_uid_gc key_len: 8 ref: NULL rows: 4 Extra: Using where; Using index for group-by

我們看到在執行計劃的 Extra 信息中有信息顯示“Using index for group-by”,實際上這就是告訴我們,MySQL Query Optimizer 通過使用松散索引掃描來實現了我們所需要的 GROUP BY 操作。

下面這張圖片描繪了掃描過程的大概實現:

MySQL分組查詢,Group,By

要利用到松散索引掃描實現 GROUP BY,需要至少滿足以下幾個條件:

◆GROUP BY 條件字段必須在同一個索引中最前面的連續位置;
◆在使用GROUP BY 的同時,只能使用 MAX 和 MIN 這兩個聚合函數;
◆如果引用到了該索引中 GROUP BY 條件之外的字段條件的時候,必須以常量形式存在;

為什么松散索引掃描的效率會很高?

因為在沒有WHERE子句,也就是必須經過全索引掃描的時候, 松散索引掃描需要讀取的鍵值數量與分組的組數量一樣多,也就是說比實際存在的鍵值數目要少很多。而在WHERE子句包含范圍判斷式或者等值表達式的時候, 松散索引掃描查找滿足范圍條件的每個組的第1個關鍵字,并且再次讀取盡可能最少數量的關鍵字。

2.使用緊湊(Tight)索引掃描實現 GROUP BY

緊湊索引掃描實現 GROUP BY 和松散索引掃描的區別主要在于他需要在掃描索引的時候,讀取所有滿足條件的索引鍵,然后再根據讀取惡的數據來完成 GROUP BY 操作得到相應結果。

  sky@localhost : example 08:55:14> EXPLAIN -> SELECT max(gmt_create) -> FROM group_message -> WHERE group_id = 2 -> GROUP BY user_id/G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: group_message type: ref possible_keys: idx_group_message_gid_uid,idx_gid_uid_gc key: idx_gid_uid_gc key_len: 4 ref: const rows: 4 Extra: Using where; Using index 1 row in set (0.01 sec)

這時候的執行計劃的 Extra 信息中已經沒有“Using index for group-by”了,但并不是說 MySQL 的 GROUP BY 操作并不是通過索引完成的,只不過是需要訪問 WHERE 條件所限定的所有索引鍵信息之后才能得出結果。這就是通過緊湊索引掃描來實現 GROUP BY 的執行計劃輸出信息。
下面這張圖片展示了大概的整個執行過程:

MySQL分組查詢,Group,By

在 MySQL 中,MySQL Query Optimizer 首先會選擇嘗試通過松散索引掃描來實現 GROUP BY 操作,當發現某些情況無法滿足松散索引掃描實現 GROUP BY 的要求之后,才會嘗試通過緊湊索引掃描來實現。

當 GROUP BY 條件字段并不連續或者不是索引前綴部分的時候,MySQL Query Optimizer 無法使用松散索引掃描,設置無法直接通過索引完成 GROUP BY 操作,因為缺失的索引鍵信息無法得到。但是,如果 Query 語句中存在一個常量值來引用缺失的索引鍵,則可以使用緊湊索引掃描完成 GROUP BY 操作,因為常量填充了搜索關鍵字中的“差距”,可以形成完整的索引前綴。這些索引前綴可以用于索引查找。而如果需要排序GROUP BY結果,并且能夠形成索引前綴的搜索關鍵字,MySQL還可以避免額外的排序操作,因為使用有順序的索引的前綴進行搜索已經按順序檢索到了所有關鍵字。

3.使用臨時表實現 GROUP BY

MySQL 在進行 GROUP BY 操作的時候要想利用所有,必須滿足 GROUP BY 的字段必須同時存放于同一個索引中,且該索引是一個有序索引(如 Hash 索引就不能滿足要求)。而且,并不只是如此,是否能夠利用索引來實現 GROUP BY 還與使用的聚合函數也有關系。

前面兩種 GROUP BY 的實現方式都是在有可以利用的索引的時候使用的,當 MySQL Query Optimizer 無法找到合適的索引可以利用的時候,就不得不先讀取需要的數據,然后通過臨時表來完成 GROUP BY 操作。

 sky@localhost : example 09:02:40> EXPLAIN -> SELECT max(gmt_create) -> FROM group_message -> WHERE group_id > 1 and group_id < 10 -> GROUP BY user_id/G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: group_message type: range possible_keys: idx_group_message_gid_uid,idx_gid_uid_gc key: idx_gid_uid_gc key_len: 4 ref: NULL rows: 32 Extra: Using where; Using index; Using temporary; Using filesort

這次的執行計劃非常明顯的告訴我們 MySQL 通過索引找到了我們需要的數據,然后創建了臨時表,又進行了排序操作,才得到我們需要的 GROUP BY 結果。整個執行過程大概如下圖所展示:

MySQL分組查詢,Group,By

當 MySQL Query Optimizer 發現僅僅通過索引掃描并不能直接得到 GROUP BY 的結果之后,他就不得不選擇通過使用臨時表然后再排序的方式來實現 GROUP BY了。

在這樣示例中即是這樣的情況。 group_id 并不是一個常量條件,而是一個范圍,而且 GROUP BY 字段為 user_id。所以 MySQL 無法根據索引的順序來幫助 GROUP BY 的實現,只能先通過索引范圍掃描得到需要的數據,然后將數據存入臨時表,然后再進行排序和分組操作來完成 GROUP BY。

 

注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区香蕉| 久久久久久久999| 亚洲综合精品伊人久久| 亚洲欧美成人一区二区在线电影| 久久久精品国产网站| 久久久久久国产精品久久| 欧美国产极速在线| 91精品免费看| 欧美精品午夜视频| 中国china体内裑精亚洲片| 中文字幕亚洲欧美日韩高清| 久久激情视频免费观看| 欧美大片免费看| 日韩在线不卡视频| 亚洲在线免费观看| 最近2019中文字幕mv免费看| 国产成人精品日本亚洲专区61| 一区二区欧美激情| 91社区国产高清| 中文字幕国产精品| 美女福利视频一区| 国产精品中文字幕在线| 美女扒开尿口让男人操亚洲视频网站| 欧美视频中文在线看| 欧美老女人性生活| 高清欧美性猛交xxxx黑人猛交| 国产午夜精品免费一区二区三区| 欧美在线一级视频| 久久91超碰青草是什么| 免费97视频在线精品国自产拍| 国产亚洲一区二区在线| 国产亚洲免费的视频看| 亚洲成年网站在线观看| 久久精品国产一区二区电影| 久久精品久久久久久| 亚洲精品一区二三区不卡| 91久久久久久| 国产欧美亚洲视频| 成人国内精品久久久久一区| 欧美性猛交xxxx富婆弯腰| 欧美在线视频免费观看| 久久久久久久久久久成人| 亚洲精品国产拍免费91在线| 国产日本欧美视频| 日韩av影视综合网| 26uuu另类亚洲欧美日本老年| 日韩免费在线看| 欧洲成人免费视频| 国产精品第一页在线| 色婷婷亚洲mv天堂mv在影片| 欧美亚洲国产视频| 韩国精品美女www爽爽爽视频| 国产欧美一区二区三区四区| 国产精品免费一区二区三区都可以| 一本色道久久88亚洲综合88| 久久久亚洲精品视频| 欧美老妇交乱视频| 亚洲激情电影中文字幕| www高清在线视频日韩欧美| 日韩av成人在线观看| 欧美精品18videos性欧美| 色综合五月天导航| 亚洲精品美女在线观看播放| 96pao国产成视频永久免费| 亚洲精品理论电影| 欧美亚洲激情在线| 在线视频国产日韩| 亚洲影视中文字幕| 美女精品久久久| 不卡伊人av在线播放| 欧美激情欧美狂野欧美精品| 欧美插天视频在线播放| 96精品视频在线| 久久久久久有精品国产| 国产成人精品久久| 欧美午夜精品久久久久久久| 日韩av资源在线播放| 18一19gay欧美视频网站| 欧美精品激情blacked18| 成人福利网站在线观看| 亚洲人成电影网站| 国产大片精品免费永久看nba| 日本高清+成人网在线观看| 欧美一级成年大片在线观看| 国产亚洲欧美视频| 国产亚洲一区二区精品| 在线成人免费网站| 欧美另类在线播放| 中文字幕精品一区二区精品| 亚洲黄色片网站| 国产日产久久高清欧美一区| 国产精品久久久久久久久久久新郎| 日韩av一卡二卡| 国产视频久久久久| 成人黄色网免费| 午夜精品一区二区三区在线视| 九九久久精品一区| 国产91色在线免费| 欧美日韩国产丝袜美女| 国语自产精品视频在线看| 亚洲成人久久一区| 日韩国产激情在线| 78色国产精品| 亚洲精品成人久久| 亚洲一区二区在线| 久久人人爽亚洲精品天堂| 欧美日韩中文字幕在线视频| 国产成人精品a视频一区www| 国产精品99久久久久久久久| 全色精品综合影院| 伊人亚洲福利一区二区三区| 欧美日韩一区二区三区在线免费观看| 欧美国产极速在线| 日本伊人精品一区二区三区介绍| 国产亚洲欧美日韩一区二区| 91中文在线视频| 成人黄色网免费| 久久理论片午夜琪琪电影网| 亚洲一区二区在线播放| 欧美一级视频免费在线观看| 久久亚洲精品一区| 亚洲风情亚aⅴ在线发布| 国产午夜精品美女视频明星a级| 中文字幕视频在线免费欧美日韩综合在线看| 国产日韩欧美在线播放| 97精品欧美一区二区三区| 欧美极品少妇全裸体| 日韩**中文字幕毛片| 久久精品国产成人| 粗暴蹂躏中文一区二区三区| 国产精品88a∨| 亚洲的天堂在线中文字幕| 成人在线视频福利| 国内精品久久久久久久久| 中文字幕国产亚洲2019| 亚洲日韩欧美视频| 尤物九九久久国产精品的分类| 国产精品成人av性教育| 日韩精品在线视频| 亚洲精品久久久久久久久久久| 欧美日韩国产专区| 一区二区亚洲欧洲国产日韩| 久久精品国产2020观看福利| 欧美成年人视频网站欧美| 精品亚洲永久免费精品| 久久久久久国产精品三级玉女聊斋| 午夜免费日韩视频| 亚洲高清免费观看高清完整版| 国产精品成av人在线视午夜片| 亚洲香蕉成人av网站在线观看| 欧美午夜宅男影院在线观看| 久久国产精品亚洲| 久久成人人人人精品欧| 久久久久久久久久久免费| 国产中文字幕日韩| 欧美日韩亚洲视频一区| 成人久久久久久| 96pao国产成视频永久免费| 欧美日韩中文字幕| 亚洲图片欧洲图片av| 欧美国产极速在线| 中文字幕在线看视频国产欧美在线看完整| 精品一区二区三区电影| 欧美日韩一区二区三区|