日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL Group by的優化詳解

瀏覽:206日期:2023-10-05 09:58:31

一個標準的 Group by 語句包含排序、分組、聚合函數,比如 select a,count(*) from t group by a ; 這個語句默認使用 a 進行排序。如果 a 列沒有索引,那么就會創建臨時表來統計 a和 count(*),然后再通過 sort_buffer 按 a 進行排序。

標準的執行流程

結構:

create table t1(id int primary key, a int, b int, index(a));delimiter ;;create procedure idata()begin declare i int; set i=1; while(i<=1000)do insert into t1 values(i, i, i); set i=i+1; end while;end;;delimiter ;call idata();

函數就是向 t1 中插入1000條語句,從(1,1,1) 到(1000,1000,1000)。

執行 select id%10 as m, count(*) as c from t1 group by m;

解析:

MySQL Group by的優化詳解

Using index,表示這個語句使用了覆蓋索引,選擇了索引 a,不需要回表;Using temporary,表示使用了臨時表;Using filesort,表示需要排序。

過程:

1、創建內存臨時表,表里有兩個字段 m 和 c,主鍵是 m;2、掃描表 t1 的索引 a,依次取出葉子節點上的 id 值,計算 id%10 的結果,記為 x;1)如果臨時表中沒有主鍵為 x 的行,就插入一個記錄 (x,1);2)如果表中有主鍵為 x 的行,就將 x 這一行的 c 值加 1;

第2 步如果發現內存臨時表存儲的總字段長度到達參數 tmp_table_size 設置的大小,那么就會將內存臨時表升級為磁盤臨時表,然后重新開始遍歷計算。3、遍歷完成后,再根據字段 m 做排序,得到結果集返回給客戶端。

MySQL Group by的優化詳解

最后的排序就是下圖虛線框中的操作,如果 sort_buffer 設置的大小不夠大,那么就會使用臨時表來輔助排序。

MySQL Group by的優化詳解

優化

未優化(也就是分組列沒有索引)的 group by 的總過程可以概括為:因為數據是無序的,所以需要創建臨時表,然后一個一個判斷屬于哪個分組,最后再根據分組列進行排序。所以,優化可以有兩個思路:

去掉排序

在明確返回的數據不需要排序的情況下,可以禁止排序,也就是將上面的語句改成 select a,count(*) from t group by a order by null。

順序排列

如果記錄都按照排序字段排序,那么數據就變成了下面的結構:

MySQL Group by的優化詳解

這樣在實際獲取要返回的字段或計算聚合函數時,只需要按順序依次訪問,等到列值變成下一個就知道當前組訪問結束,將之前統計的數據直接返回。這樣就避免了創建臨時表,同時排序也不需要使用 sort_buffer 進行額外排序。這樣就極大地提高了執行的效率。

實現

1、如果分組字段適合創建索引就直接為分組字段創建索引。

MySQL 5.7 版本支持了 generated column 機制,用來實現列數據的關聯更新。你可以用下面的方法創建一個列 z,然后在 z 列上創建一個索引(如果是 MySQL 5.6 及之前的版本,你也可以創建普通列和索引,來解決這個問題)

alter table t1 add column z int generated always as(id % 100), add index(z);

然后解析:

MySQL Group by的優化詳解

這時沒有用到臨時表和額外排序,所以性能提升。

2、如果分組字段不適合(使用率很低),那么可以使用 SQL_BIG_RESULT 來嘗試優化。

在 group by 語句中加入 SQL_BIG_RESULT 這個提示(hint),就可以告訴優化器:這個語句涉及的數據量很大,請直接用磁盤臨時表。MySQL 的優化器一看,磁盤臨時表是 B+ 樹存儲,存儲效率不如數組來得高。所以,既然使用SQL_BIG_RESULT來說明數據量很大,那從磁盤空間考慮,還是直接用數組來存吧。所以在使用 SQL_BIG_RESULT 后優化器會使用數組結構的磁盤臨時表。

但是如果在未達到磁盤臨時表的使用條件是不會使用磁盤臨時表的,也就是在 sort_buffer 空間能夠存儲要返回和排序的總字段長度時,就使用數組結構的 sort_buffer ,如果總字段超過 sort_buffer 大小,那么就再加上數組結構的磁盤臨時表來幫助排序。

那么在 sort_buffer 空間足夠的情況下, sort_buffer 內部就會對數據進行排序,這樣也就起到了索引的作用,

還是以上面的例子來看,使用 SQL_BIG_RESULT

alter table t1 add column z int generated always as(id % 100), add index(z);

具體過程如下:

1、初始化 sort_buffer,確定放入一個整型字段,記為 m;2、掃描表 t1 的索引 a,依次取出里面的 id 值, 將 id%10 的值存入 sort_buffer 中;3、掃描完成后,對 sort_buffer 的字段 m 做排序(如果 sort_buffer 內存不夠用,就會利用磁盤臨時文件輔助排序);4、排序完成后,就得到了一個有序數組。

MySQL Group by的優化詳解

解析:

MySQL Group by的優化詳解

可以看到此時就沒有使用臨時表了,而是直接使用 sort_buffer 進行排序,這樣就省去了使用臨時表帶來的性能消耗。

總結

1、如果對 group by 語句的結果沒有排序要求,要在語句后面加 order by null;那么一般情況就不需要使用臨時表了(上面兩個優化都是在要求排序的前提下提出的優化方式)2、盡量讓 group by 過程用上表的索引,確認方法是 explain 結果里沒有 Using temporary 和 Using filesort;3、如果 group by 需要統計的數據量不大,盡量只使用內存臨時表;也可以通過適當調大 tmp_table_size 參數,來避免用到磁盤臨時表;4、如果數據量實在太大,使用 SQL_BIG_RESULT 這個提示,來告訴優化器直接使用排序算法得到 group by 的結果。

以上就是詳解MySQL Group by 優化的詳細內容,更多關于MySQL Group by 優化的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩亚洲一区在线| 国产日产精品_国产精品毛片 | 日韩中出av| 99久久激情| 久久男人天堂| 97在线精品| 精品视频在线一区二区在线| 国产精品欧美三级在线观看| 国产亚洲欧美日韩在线观看一区二区| 亚洲综合婷婷| 色综合视频一区二区三区日韩 | 先锋亚洲精品| 国产精品国产三级国产在线观看| 日本久久二区| 国产精品一国产精品k频道56| 免费久久精品| 午夜国产精品视频免费体验区| 国产在线不卡| 精品日韩视频| 私拍精品福利视频在线一区| 国产日韩高清一区二区三区在线 | 久久国产电影| 国产福利片在线观看| 亚洲成人二区| 婷婷亚洲五月色综合| 亚洲精品成人| 日韩一二三区在线观看| 99国产精品私拍| 亚洲精品高潮| 久久久久亚洲精品中文字幕| 风间由美中文字幕在线看视频国产欧美| 国产精品igao视频网网址不卡日韩 | 日韩一区精品字幕| 亚洲女人av| 亚洲制服欧美另类| 日韩精品三级| 久久不卡日韩美女| 国产极品嫩模在线观看91精品| 中文字幕一区久| 国产一区二区中文| 日韩手机在线| 婷婷激情一区| 亚洲乱码一区| 高清日韩欧美| 久久精品国产亚洲aⅴ| 日韩中文首页| 欧美中文日韩| 嫩草伊人久久精品少妇av杨幂| av免费不卡国产观看| 视频一区视频二区在线观看| 精品久久一区| 少妇精品在线| 亚洲女同中文字幕| 亚洲精品成人图区| 国产精品一区二区免费福利视频| 成人日韩在线| 精品国产亚洲一区二区三区大结局 | 国产亚洲精品美女久久| 红桃视频国产一区| 99久久精品费精品国产| 日本不卡视频一二三区| 四虎884aa成人精品最新| 欧美日本久久| 男人的天堂亚洲一区| 欧美激情另类| 亚洲精品少妇| 999久久久91| 精品一区二区三区中文字幕 | 日韩不卡在线观看日韩不卡视频| 日韩高清中文字幕一区二区| 麻豆91在线播放| 国产粉嫩在线观看| 伊人久久大香线蕉av不卡| 婷婷丁香综合| 国产精品久久久亚洲一区| 日本亚洲最大的色成网站www| 国产精品最新| 久久要要av| 日韩欧美高清一区二区三区| 国产免费av国片精品草莓男男| 国产日本精品| 四虎4545www国产精品| 蜜臀久久99精品久久久久宅男 | 国产伦精品一区二区三区视频| 日韩av在线播放网址| 蜜桃tv一区二区三区| 亚州av日韩av| 深夜视频一区二区| 亚洲免费网址| 四虎成人av| 日韩不卡一二三区| 亚洲精华国产欧美| 精品免费在线| 国产女人18毛片水真多18精品| 国产一区二区高清| 免费人成黄页网站在线一区二区| 日韩中出av| 91欧美国产| 亚洲aa在线| 在线看片福利| 中文字幕日韩高清在线| 国产激情精品一区二区三区| 欧美日一区二区| 久久亚洲风情| 欧美精品aa| 国产一区视频在线观看免费| 国产美女亚洲精品7777| 欧美日韩日本国产亚洲在线| 国产欧美91| 日韩视频一区| 成人精品中文字幕| 日韩精品视频在线看| 欧美日韩国产探花| 98精品视频| 精品一区二区男人吃奶 | 日韩国产91| 欧美精品资源| 欧美国产专区| 日本视频在线一区| 99在线|亚洲一区二区| 在线天堂资源www在线污| 日本久久二区| 中文字幕一区二区av| 欧美精品一区二区三区精品| 国产suv精品一区二区四区视频| 亚州国产精品| 亚洲乱亚洲高清| 免费成人在线影院| 欧美日韩精品一本二本三本 | 婷婷亚洲五月色综合| 日本欧美国产| 国产精品v亚洲精品v日韩精品| 亚洲精品影视| 亚洲专区视频| 久久午夜视频| 亚洲综合图色| 日本va欧美va瓶| 日韩国产在线一| 亚洲2区在线| 青草av.久久免费一区| 日本91福利区| 国产乱子精品一区二区在线观看| 亚欧成人精品| 日韩一区二区三区高清在线观看| 亚洲精品欧美| 国产探花在线精品一区二区| 国产精品调教| 亚洲精品**中文毛片| 综合日韩av| 女人av一区| 午夜亚洲福利| 久久永久免费| 99成人在线视频| 国产亚洲欧洲| 欧美精品福利| 欧美成人基地| 美女精品一区| 亚洲欧美专区| 国产激情久久| 亚州av乱码久久精品蜜桃| 亚洲综合中文| 色婷婷综合网| 天堂成人免费av电影一区| 欧美亚洲一级| 免费黄色成人| 美女精品久久| 日韩精品一二三区| 久久精品女人| 亚洲激情中文| 精品国产91| 亚洲人成在线影院| 天堂√8在线中文| 国产视频一区免费看| 国产精品.xx视频.xxtv| 婷婷综合网站| 国产在线一区不卡| 日本不卡不码高清免费观看 | 日韩黄色免费网站| 久久久久久免费视频| 国产欧美日韩精品一区二区免费| 影视先锋久久| 麻豆精品视频在线| 综合一区二区三区| 日韩电影免费网址| 国产激情综合| 日韩成人午夜精品| 免费成人av在线播放| 黑丝一区二区三区| 99视频精品全部免费在线视频| 国产一区二区三区久久| 国产情侣一区在线| 日韩国产在线一| 蜜桃视频第一区免费观看| 亚洲成人三区| 欧美成人综合| 欧美a级片一区| 欧美日韩视频免费观看| 黄色精品视频| 国产精品v亚洲精品v日韩精品| 一级欧美视频|