索引
作用:提高資料查詢的效率
常用索引模型
- 哈希表
- 有序陣列
- 搜索樹
哈希表
以鍵值對的形式存盤,適合于只有等值查詢的場景,
用一個哈希函式把key換算成一個確定的位置,然后把value這個位置的陣列中,一個key會對應一個陣列,陣列中會有多個value,value并不是有序的,
查找時先通過哈希函式算出key,找到具體的陣列,然后遍歷陣列,找到具體的位置,
有序陣列
以有序陣列形式存盤,等值查詢和范圍查詢場景中性能非常優秀,只適用于靜態存盤引擎,
僅僅看查詢效率,有序陣列就是最好的資料結構了,但是,在需要更新資料多的時候就麻煩了,你往中間插入一個記錄就必須得挪動后面所有的記錄,成本太高,
所以,有序陣列索引只適用于靜態存盤引擎,比如你要保存2017年某個城市的所有人口資訊,這類不會再修改的資料,
搜索樹
以類似二叉樹的多叉樹來實作,
- 二叉搜索樹:每個節點的左兒子小于父節點,父節點又小于右兒子,
- 多叉樹:每個節點有多個兒子,兒子之間的大小保證從左到右,
在MySQL中,索引是在存盤引擎層實作的,所有并沒有同一的索引標準,即不同存盤引擎的索引的作業方式并不一樣,而即使多個存盤引擎支持同一種型別的索引,其底層的實作也可能不同,
InnoDB使用了B+樹索引模型,所有的資料都是存盤在B+樹中的,每一個索引在InnoDB里面對應一棵B+樹,主鍵索引對應主B+樹,
- 主鍵索引:對應主
B+樹,葉子節點存盤的是整行資料,也稱為聚簇索引 - 非主鍵索引:每個非主鍵索引對應一個
B+樹,葉子節點存盤的是主鍵的值,也稱為二級索引,
基于主鍵索引和普通索引的查詢的區別?
- 如果陳述句是
select * from T where ID = 500,主鍵查詢方式,即只需要搜索ID這棵B+樹,葉子節點中有存盤整行資料; - 如果陳述句是
select * from T where k = 5,普通索引查詢方式,則需要先搜索k索引樹,得到主鍵ID的值為500,再到主鍵ID索引樹搜索一次,這個程序成為回表,
回到主鍵索引樹搜索的程序,我們稱為回表,
也就是說:基于非主鍵索引的查詢需要多掃描一顆索引樹,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/62711.html
標籤:MySQL
上一篇:事務隔離(3)
下一篇:索引下(5)
