在數(shù)據(jù)庫查詢中,group by語句經(jīng)常使用,而這個語句的使用是最耗性能的,按常理,
我們生活中要這樣做也很麻煩,有兩種情形:
? ? ? ? 1、有索引的情況
? ? ? ? 2、無索引的情況
對于第一種情況,如果在生活中要做這樣的事情,很惱火,我們正常的想法是,先把所有的
按高矮順序來排序,最后是一組的就直接挑出來了,但 怎樣實現(xiàn)這個排序呢?
? ? ? ? ?根據(jù)上一篇文件排序filesort的規(guī)則,我們可以這樣,先讓局部有序,然后在慢慢擴散
來排列整個數(shù)據(jù),方法是:選擇適當?shù)拇笮〉呐判驂K緩存大小,每次取出塊大小數(shù)據(jù),利用
快速排序功能對該塊排序,然后存入臨時文件,然后利用歸并排序的思想,將各個塊之間進行
排序,最終達到排序完成。
? ? ? ? ?對于上面的描述,雖然排序使用了非常快的排序算法快排和歸并排序,但這個涉及的臨時
文件的讀取操作,浪費大量的I/O,性能上是危害很大的,因此,掌握好在使用group by的語句的
使用,盡量使用到索引,免除了排序的操作,group by的速度就上來了,并且也不會消耗太多
內(nèi)存大小,下面敘述一下group by使用索引的原理
一、 group by 使用索引原理
? ? ? ? ? 1、group by 使用排序來讀取數(shù)據(jù),所以只能用btree索引,不能使用在hash索引的算法中
? ? ? ? ? ? ? ? ?因為hash索引是一種類似鍵值對的快速訪問方式,這個對于指定某個值查詢很好,但
? ? ? ? ? ? ? ? ?沒有排序的方法,其使用的hash函數(shù) + 碰撞沖突解決方案
? ? ? ? ? 2、當使用索引排序來查找數(shù)據(jù)時,不會在explain中extra列看到有using filesort
? ? ? ? ? 3、在group by操作完成后,還會對group出來的結(jié)果進行排序,因此如果對排序的結(jié)果
? ? ? ? ? ? ? ? 沒有排序的需求,可以考慮在其后面加上order by null
二、group by 訪問索引的方法
? ? ? ? ? group by 訪問數(shù)據(jù)有兩種方法:
? ? ? ? ? ? ? ? ? ? ? 1、邊掃描邊執(zhí)行g(shù)roup操作,叫做松散索引掃描(Loose index scan)
? ? ? ? ? ? ? ? ? ? ? 2、先執(zhí)行一個范圍(range)掃描,然后在執(zhí)行g(shù)roup 操作,叫做
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?緊索引掃描(Tight index scan)
2.1、松散索引掃描(Loose index scan)
? ? ? ? ? 最高效的 處理group by的方法是,直接訪問相應(yīng)的索引,所以不用排序就能根據(jù)
索引來讀取需要的數(shù)據(jù),而對于如聚簇索引(cluster index),我們可以讀取前面的一部分
的字段索引來獲取數(shù)據(jù),而不用滿足所有的列,這就叫做松散索引掃描,我的定義可為:
前綴索引掃描
? ? ? ? ? ?使用松散索引掃描的條件:
? ? ? ? ? ? ? ? ? ?1、查詢只能針對一個單表進行操作,這個可是個致命的缺點啊,但如果where
? ? ? ? ? ? ? ? ? ? ? ? ? 條件比較多,選出來的數(shù)據(jù)少的話,還是不用擔憂的
? ? ? ? ? ? ? ? ? ?2、group by使用索引為:對聚簇索引使用前綴索引
? ? ? ? ? ? ? ? ? ?3、使用類似group by 的操作的函數(shù)有distinct函數(shù),使用此函數(shù)時,要么在一個
? ? ? ? ? ? ? ? ? ? ? ? ? 索引上使用,要么在group by時,其group by的字句是索引掃描,否則會引
? ? ? ? ? ? ? ? ? ? ? ? ? 起全表掃描。
? ? ? ? ? ? ? ? ? ?4、在使用group by語句中,如果使用聚合函數(shù)max(), min()等,如果列不在group
? ? ? ? ? ? ? ? ? ? ? ? ? by的列中,或不在group by 列的聚簇索引的一部分,這將會用到排序操作
? ? ? ? ? ? ? ? ? ?5、只能對整個列的值排序時使用到索引,而只有前面一部分索引不能用到排序,
? ? ? ? ? ? ? ? ? ? ? ? ? 如: 列 c1 char(20), index(c1(10))、這個只用了一半索引,將無法使用來對
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 整個數(shù)據(jù)排序








暫無數(shù)據(jù)