一:索引的常見模型算法
1.哈希表(key-value)存儲的數據結構sql
缺點:hash索引在作區間查詢時,速度慢。數組
優勢:hash索引很適用於等值查詢的場景,好比memcached以及其餘一些nosql引擎。數據結構
2.有序數組nosql
優勢:有序數組在等值查詢和範圍查詢的場景中,性能都很是優秀。memcached
若是僅僅看查詢效率,有序數組是最好的數據結構。性能
缺點:更新數據時成本過高。ui
總結:有序數組只適用於靜態存儲引擎。索引
3.m叉搜索樹hash
二:InnoDB的索引模型
每個索引在InnoDB裏面,對應一顆B+樹。
根據葉子節點的內容,索引分爲主鍵索引和非主鍵索引。主鍵索引的葉子節點存儲的是整行數據,在innoDB裏,主鍵索引也被稱爲聚族索引(clustered index)。
非主鍵索引的葉子節點內容是主鍵的值。在innoDB裏,非主鍵索引被稱爲二級索引(secondary index)。
基於主鍵索引和普通索引的查詢,有什麼區別?
若是語句是:select * from T where id = 500,主鍵查詢方式,只須要搜索id這顆B+樹;
若是語句是:select * from T where k = 5,普通索引查詢方式,須要先搜索K索引樹,獲得id的值爲500,再到id索引樹搜索一次。這就是回表。
三:索引維護
若是某記錄所在的數據頁已經滿了,根據B+樹的算法,這時候須要申請一個新的數據頁,而後挪動部分數據過去,這個過程爲頁分裂。這種狀況下,性能會受到影響。
除了性能以外,頁分裂還能影響數據頁的利用率。本來放在一個頁的數據,如今分到兩個頁中,總體空間利用率下降了50%。
自增主鍵:自增主鍵的數據插入模式,正符合了咱們前面提到的遞增插入的場景。每次插入一條新紀錄,都是追加操做,不涉及挪動其餘記錄,更不會觸發葉子節點的分裂。
除了考慮上面的性能,還能夠從存儲空間來看。好比表中有個惟一字段,若是咱們是uuid,那麼非主鍵的葉子節點都是主鍵的值,每一個二級索引的葉子節點佔用了36個字節,
但若是用整型看成主鍵,只須要4個字節,若是長整型,那也只有8個字節。
總結:主鍵長度越小,普通索引的葉子節點就會越小,普通索引佔用的空間也會越小。