mysql b-tree 索引
b-tree 索引
該索引意味著所有的值都是按順序儲存的,並且每一個葉子與根的的距離相同
B-Tree索引能夠加快訪問資料的速度,因為儲存引擎不再需要進行全表掃描來獲取需要的資料,取而代之的是從索引的根節點開始進行搜尋.通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點,這些指標實際上定義了子節點頁中值的上限和下限。最終儲存引擎要麼是找到對應的值,要麼該記錄不存在。
B-Tree索引適用於全鍵值、鍵值範圍或鍵字首查詢。其中鍵字首查詢只適用於根據最左字首的查詢
全值匹配
全值匹配指的是和索引中的所有列進行匹配,例如前面提到的索引可用於查詢姓名為Cuba Allen、出生於1960-01-01的人。
匹配最左字首
前面提到的索引可用於查詢所有姓為Allen的人,即只使用索引的第一列。
匹配列字首
也可以只匹配某一列的值的開頭部分。例如前面提到的索引可用於查詢所有以J開頭的姓的人。這裡也只使用了索引的第一列。
匹配範圍值
例如前面提到的索引可用於查詢姓在Allen和Barrymore之間的人。這裡也只使用了索引的第一列。
精確匹配某一列並範圍匹配另外一列
前面提到的索引也可用於查詢所有姓為Allen,並且名字是字母K開頭(比如Kim、Karl等)的人。即第一列last_name 全匹配,第二列frst_name 範圍匹配。
只訪問索引的查詢
B-Tree通常可以支援“只訪問索引的查詢”,即查詢只需要訪問索引,而無須訪問資料行。
B-Tree索引的限制:
如果不是按照索引的最左列開始查詢,則無法使用索引。例如上面例子中的索引無法用於查詢名字為Bill的人,也無法查詢某個特定生日的人,因為這兩列都不是最左資料列。類似地,也無法查詢姓氏以某個字母結尾的人。
不能跳過索引中的列。也就是說,前面所述的索引無法用於查詢姓為Smith並且在某個特定日期出生的人。如果不指定名(first_name ),則MySQL只能使用索引的第一列。
如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引優化查詢。例如有查詢WHERE last_name='Smith' AND frst_name LIKE 'J%' AND dob='1976-12-23' ,這個查詢只能使用索引的前兩列,因為這裡LIKE 是一個範圍條件(但是伺服器可以把其餘列用於其他目的)。如果範圍查詢列值的數量有限,那麼可以通過使用多個等於條件來代替範圍條件。