99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
2019-03-09 閱讀量: 1022
SQL優(yōu)化之SELECT優(yōu)化 ——group by

在數(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ù)排序

27.2058
3
關(guān)注作者
收藏
評論(0)

發(fā)表評論

暫無數(shù)據(jù)
推薦帖子