標籤:索引
一,查詢B+樹索引的流程
B+樹索引找到分葉節點,再找到對應的資料頁,然後將資料頁載入到記憶體中,通過二分尋找Page Directory中的槽,尋找出一個粗略的目錄,然後根據槽的指標指向鏈表中的行記錄,之後在鏈表中依次尋找。
需要注意的地方是,B+樹索引不能找到具體的一條記錄,而是只能找到對應的頁。把頁從磁碟裝入到記憶體中,再通過Page
Directory進行二分尋找,同時此二分尋找也可能找不到具體的行記錄(有可能會找到),只是能找到一個接近的鏈表中的點,再從此點開始遍曆鏈表進行尋找。
二,聚簇索引與非聚簇索引
B+樹索引可以分為叢集索引和輔助索引,他們不同點是,叢集索引的行資料和主鍵B+樹儲存在一起,輔助索引只儲存輔助鍵和主鍵。
1.叢集索引
叢集索引是按每張表的主鍵構造的一顆B+樹,並且分葉節點中存放著整張表的行記錄資料,因此也讓叢集索引的節點成為資料頁,這個特性決定了索引組織表中資料也是索引的一部分。由於實際的資料頁只能按照一顆B+樹進行排序,所以每張表只能擁有一個叢集索引。查詢最佳化工具非常傾向於採用叢集索引,因為其直接儲存行資料,所以主鍵的排序查詢和範圍尋找速度非常快。
不是物理上的連續,而是邏輯上的,不過在剛開始時資料是順序插入的所以是物理上的連續,隨著資料增刪,物理上不再連續
2.輔助索引
輔助索引頁層級不包含行的全部資料。分葉節點除了包含索引值以外,每個分葉層級中的索引行中還包含了一個書籤,該書籤用來告訴InnoDB哪裡可以找到與索引相對應的行資料。其中存的就是叢集索引的鍵。
輔助索引的存在並不影響資料在叢集索引的結構組織。InnoDB會遍曆輔助索引並通過分葉層級的指標獲得指向主鍵索引的主鍵,然後通過主鍵索引找到一個完整的行記錄。當然如果只是需要輔助索引的值和主鍵索引的值,那麼只需要尋找輔助索引就可以查詢出索要的資料,就不用再去查主鍵索引了。
三,索引的管理
索引在建立或者刪除時,MySQL會先建立一個新的暫存資料表,然後把資料匯入暫存資料表,刪除原表,再把暫存資料表更名為原表名稱。
但是在InnoDB Plugin版本開始,支援快速建立索引。其原理是先在InnoDB上加一個s鎖,在建立過程中不需要建表,所以速度會很快。建立過程中由於加了s鎖,所以只能進行讀操作,不能寫操作。
show index form table;是查看錶中索引的資訊的。
Table:索引所在的表名
Non_unique:非唯一的索引,可以看到primary key 是0,因為必須是唯一的
Key_name:索引名稱
Seq_in_index:索引中該列的位置
Column_name:索引的列
Collation:列以什麼方式儲存在索引中。可以是A或者NULL,B+樹索引總是A,即排序的。
Cardinality:表示索引中唯一值的數目的估計值。如果非常小,那麼需要考慮是否還需要建立這個索引了。最佳化器也會根據這個值來判斷是否使用這個索引。
Sub_part:是否是列的部分被索引。100表示只索引列的前100個字元。
Packed:關鍵字如果被壓縮。
Null:是否索引的列含有NULL值。
Index_type:索引的類型。InnoDB只支援B+樹索引,所以顯示BTREE
本文出自 “餓狼的傳說” 部落格,請務必保留此出處http://9548010.blog.51cto.com/9538010/1878664
mysql B+樹索引簡述