1. 程式人生 > >B-Tree索引有效和失效的情況

B-Tree索引有效和失效的情況

以索引key{last_name, first_name, dob)為例
索引有效的情況:
1.全位匹配:
全值匹配指的是和索引中的所有列進行匹配, 例如前面提到的索引可用於查詢姓名為CubaAllen、出生於1960-01-01 的人。
2.匹配最左前級
前面提到的索引可用於查詢所有姓為Allen 的人, 即只使用索引的第一列。
3.匹配到前級
也可以只匹配某一列的值的開頭部分。 例如前面提到的索引可用於查詢所有以J開頭的姓的人。 這裡也只使用了索引的第一列。
4.匹配範圍值
例如前面提到的索引可用於查詢姓在Allen 和B arrymore之間的人。 這裡也只使用了索引的第一列。
5.精確匹配第一列並範圍匹配另外一列
前面提到的索引也可用於查詢所有姓為Allen,井且名字是字母K開頭(比如Kim、 Karl等) 的人。 即第一列last_name也全匹配,第二列first_name範圍匹配。
6.只訪問索引的查詢
B-Tree通常可以支援 “只訪問索引的查詢”,即查詢只需要訪問索引, 而無須訪問 資料行。 後面我們將單獨討論這種 “覆蓋索引” 的優化。
索引失效的情況:


1.如果不是按照索引的最左列開始查詢, 則無站使用索引。 例如上面例子中的索引無法用於查詢名字為B ill的人, 也無法查詢某個特定生日的人, 因為這兩列都不是最
左資料列。 類似地, 也無站查詢姓氏以某個字母結尾的人。
2.不能跳過索引中的列。也就是說,前面所述的索引無法用於查詢姓為Smith 並且在某個特定日期出生的人。如果不指定名( first_name),則 MySQL 只能使用索引的 第一列。
只用到第一列:
在這裡插入圖片描述
用到全列:
在這裡插入圖片描述
3.如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引優化查詢。例如 ’ ’
有查詢 WHERE last name=‘Smith ’ AND first_name like ’ J%’ AND dob = 1976-
12- 23 ’ ,這個查詢只能使用索引的前兩列,因為這裡like是一個範圍條件(但是伺服器可以把其餘列用於其他目的)。如果範圍查詢列值的數量有限,那麼可以通過使用多個等於條件來代替範圍條件。
到這裡讀者應該可以明白,前面提到的索引列的順序是多麼的重要:這些限制都和索引 列的順序有關。在優化效能的時候,可能需要使用相同的列但順序不同的索引來滿足不 同類型的查詢需求。
4.獨立的列
“獨立的列” 是指索引列不能是 表示式的一部分, 也不能是函式的引數。