日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 分组查询原理,MySQL分組查詢Group By實現原理詳解

發布時間:2025/3/8 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 分组查询原理,MySQL分組查詢Group By實現原理詳解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

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

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

◆GROUP BY 條件字段必須在同一個索引中最前面的連續位置;

◆在使用GROUP BY 的同時,只能使用 MAX 和 MIN 這兩個聚合函數;

◆如果引用到了該索引中 GROUP BY 條件之外的字段條件的時候,必須以常量形式存在;

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

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

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

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

這時候的執行計劃的 Extra 信息中已經沒有“Using index for group-by”了,但並不是說 MySQL 的 GROUP BY 操作並不是通過索引完成的,只不過是需要訪問 WHERE 條件所限定的所有索引鍵信息之后才能得出結果。這就是通過緊湊索引掃描來實現 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 操作。

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

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

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

總結

以上是生活随笔為你收集整理的mysql 分组查询原理,MySQL分組查詢Group By實現原理詳解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本簧片在线观看 | 国产一区二区在线观看视频 | 国产一区2区 | 99精品视频在线观看免费 | 欧美日韩91 | 久久婷婷国产麻豆91 | 亚洲理论在线 | 成年性生交大片免费看 | 天使色吧 | 无人在线观看的免费高清视频 | 白浆影院 | 国产精品9191 | 天堂网视频在线观看 | 久久久久久国产视频 | 成人在线免费播放视频 | 国产成人麻豆精品午夜在线 | 国产精品资源在线观看 | 欧美一区二区激情 | 综合色在线视频 | 亚洲女人天堂网 | 国产51视频| 在线中文字幕一区二区 | 奇米影视第四色888 免费观看a毛片 | 欧美第一色 | 亚洲一区二区av在线 | 久久久久久久久久久久久av | 91在线免费网站 | 日韩欧美毛片 | 精品人妻一区二区三区蜜桃视频 | 国产欧美在线视频 | 精品一区二区三区精华液 | 毛片视频免费观看 | 三级91| 波多野结衣av在线免费观看 | 爱爱视频日本 | 极品色av影院 | 欧美中文字幕一区二区 | 三级欧美韩日大片在线看 | av在线不卡免费观看 | 午夜伦理视频 | 婷婷综合五月 | 欧美日韩精品三区 | 女同二区 | 日韩一区二区视频 | 99热一区二区 | 熟睡人妻被讨厌的公侵犯 | 黄大色黄大片女爽一次 | 奇米四色7777 | 亚洲人成久久 | 自拍1页 | 国产视频在线观看一区二区 | 久久中文娱乐网 | 少妇一级淫片免费放 | 亚洲人成一区 | 私库av在线 | 精品国产免费观看 | 人成免费在线视频 | 精品人妻人伦一区二区有限公司 | 极品人妻一区二区三区 | 牛人盗摄一区二区三区视频 | 99ri视频 | 成年黄色片 | 麻豆av电影网 | 松本一香在线播放 | 午夜亚洲aⅴ无码高潮片苍井空 | 天天射夜夜操 | 香蕉久热| 一级一毛片 | 亚洲精品久久久久久一区二区 | 亚洲视频在线看 | 亚洲成在线 | 国产精品久久av无码一区二区 | 黄色a一级 | 国产精品久久不卡 | 国产传媒国产传媒 | 福利一区二区在线 | av一卡| 国产a网站| 成人毛片软件 | 人人澡超碰碰97碰碰碰 | 亚洲精品乱码久久久久久自慰 | 国产视频福利在线 | 午夜成人影视 | 亚洲免费av网站 | 亚洲国产欧美一区二区三区深喉 | a级片在线观看视频 | 91国内揄拍国内精品对白 | 久久久久人妻一区二区三区 | 色乱码一区二区三区在线男奴 | 亚洲黄色片在线观看 | 亚洲情侣av | 9l视频自拍九色9l视频 | 欧美日韩亚洲高清 | 国产精品成人电影在线观看 | 亚洲精品久久久久久一区二区 | 蛇女欲潮性三级 | 国产人成在线观看 | 人人草网| v天堂在线观看 |