top
Loading...
7.2.13.1.松散索引掃描
7.2.13.1. 松散索引掃描

使用索引時最有效的途徑是直接搜索組域。通過該訪問方法,MySQL使用某些關鍵字排序的索引類型(例如,B-)的屬性。該屬性允許使用 索引中的查找組而不需要考慮滿足所有WHERE條件的索引中的所有關鍵字。既然該訪問方法只考慮索引中的關鍵字的一小部分,它被稱為松散索引掃描。如果沒有WHERE子句, 松散索引掃描讀取的關鍵字數量與組數量一樣多,可以比所有關鍵字數小得多。如果WHERE子句包含范圍判斷式(關于range聯接類型的討論參見7.2.1節,“EXPLAIN語法(獲取關于SELECT的信息)), 松散索引掃描查找滿足范圍條件的每個組的第1個關鍵字,并且再次讀取盡可能最少數量的關鍵字。在下面的條件下是可以的:

·         查詢針對一個單表。

·         GROUP BY包括索引的第1個連續部分(如果對于GROUP BY,查詢有一個DISTINCT子句,則所有顯式屬性指向索引開頭)

·         只使用累積函數(如果有)MIN()MAX(),并且它們均指向相同的列。

·         索引的任何其它部分(除了那些來自查詢中引用的GROUP BY)必須為常數(也就是說,必須按常量數量來引用它們),但MIN()MAX() 函數的參數例外。

此類查詢的EXPLAIN輸出顯示Extra列的Using indexforgroup-by

下面的查詢提供該類的幾個例子,假定表t1(c1,c2,c3,c4)有一個索引idx(c1c2c3)

SELECT c1, c2 FROM t1 GROUP BY c1, c2;

SELECT DISTINCT c1, c2 FROM t1;

SELECT c1, MIN(c2) FROM t1 GROUP BY c1;

SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;

SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2;

SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;

SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2

由于上述原因,不能用該快速選擇方法執行下面的查詢:

1.      除了MIN()MAX()還有其它累積函數,例如:

     SELECT c1, SUM(c2) FROM t1 GROUP BY c1;

2.      GROUP BY子句中的域不引用索引開頭,如下所示:

     SELECT c1,c2 FROM t1 GROUP BY c2, c3;

3.      查詢引用了GROUP BY部分后面的關鍵字的一部分,并且沒有等于常量的等式,例如:

     SELECT c1,c3 FROM t1 GROUP BY c1, c2
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗