算法
哈希表是一種常見的數據結構,即經過哈希算法計算出一個數字在表中的位置,並將數字存入該表。哈希索引就是經過哈希表來實現的,通常狀況下查找時間複雜度爲O(1)。InnoDB會監控對錶上各索引頁的查詢,會自動根據訪問的頻率和模式爲某些熱點頁創建哈希索引,因此又叫自適應哈希索引,訪問模式同樣指查詢的條件同樣。數據庫
好比咱們維護一張身份證信息和用戶姓名的表,須要根據身份證號查詢姓名,哈希索引大概是這樣的:數組
哈希索引適合只有等值查詢的場景,例如select * from T where index_col = '##'。哈希索引是無序的,若是須要區間查詢,那就要把全部數據掃描一遍。數據結構
有序數組在等值查詢和區間查詢場景中效率都很高,一樣用上面的表舉例,索引大概是這樣的:spa
要查詢某條數據或者區間的時候,使用二分法時間複雜度爲O(logN)。但若是須要在中間更新數據時,那麼就要移動後面全部的數據。有序數組索引只適用於靜態存儲引擎,好比保存2019年度學校全部學生信息。設計
B+樹是爲磁盤或其餘直接存取輔助設備設計的一種平衡查找樹。下面是一顆高度爲2的B+樹,全部記錄都在葉子結點上順序存放,葉子結點經過指針相連。3d
B+樹索引就是B+樹在數據庫中的實現,因爲B+索引在數據庫中具備高扇出性,在數據庫中B+樹的高度通常爲2~4層。查找某一鍵值的行記錄時最多隻須要2~4次IO。以InnoDB的一個整數字段索引爲例,這顆B+樹大概是1200叉樹,這裏N叉樹的N取決於數據塊的大小。高度爲4的時候就能夠存1200的3次方個值,大概爲17億。考慮到樹根的數據塊老是在內存中,一個10億行的表上一個整數字段的索引,查找一個值最多隻須要訪問3次磁盤。指針
在InnoDB存儲引擎中,表是根據主鍵順序存放的。根據葉子結點內容,B+樹索引又分爲聚簇索引和輔助索引。code
咱們用一個例子來講明上面的概念,建立一張表,在字段k上有索引:blog
create table T( id int primary key, k int not null, name varchar(16), index (k))engine=InnoDB;
表中R1~R5的(ID,k)值分別爲(100,1)、(200,2)、(300,3)、(500,5)和(600,6),兩顆B+樹以下,能夠明顯看到這兩個顆樹的區別。