索引原理分析

索引的存儲結構html

索引存儲結構算法

索引是在存儲引擎中實現的,也就是說不一樣的存儲引擎,會使⽤不一樣的索引
MyISAM和InnoDB存儲引擎:只⽀持B+ TREE索引, 也就是說默認使⽤BTREE,不可以更換
MEMORY/HEAP存儲引擎:⽀持HASH和BTREE索引
B樹和B+樹
數據結構示例⽹站:
https://www.cs.usfca.edu/~gal...
B樹圖示
B樹是爲了磁盤或其它存儲設備⽽設計的⼀種多叉(下⾯你會看到,相對於⼆叉,B樹每一個內結點有多個分⽀,即多叉)平衡查找樹。 多叉平衡
image.png
B樹的⾼度⼀般都是在2-4這個⾼度,樹的⾼度直接影響IO讀寫的次數。
若是是三層樹結構---⽀撐的數據能夠達到20G,若是是四層樹結構---⽀撐的數據能夠達到⼏⼗T數據結構

B樹和B+樹的區別
B樹和B+樹的最⼤區別在於⾮葉⼦節點是否存儲數據的問題。spa

  • B樹是⾮葉⼦節點和葉⼦節點都會存儲數據。
  • B+樹只有葉⼦節點纔會存儲數據,⽽且存儲的數據都是在⼀⾏上,⽽且這些數據都是有指針指向的,也就是有順序的。 索引列 order by

⾮彙集索引(MyISAM)
B+樹葉⼦節點只會存儲數據⾏(數據⽂件)的指針,簡單來講數據和索引不在⼀起,就是⾮彙集索引。
⾮彙集索引包含主鍵索引和輔助索引都會存儲指針的值設計

主鍵索引
image.png
這⾥設表⼀共有三列,假設咱們以 Col1 爲主鍵,則上圖是⼀個 MyISAM 表的主索引(Primary key)示意。
能夠看出 MyISAM 的索引⽂件僅僅保存數據記錄的地址。
image.png指針

輔助索引(次要索引)
在 MyISAM 中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求 key 是惟⼀的,⽽輔助索引的 key 能夠重複。若是咱們在 Col2 上建⽴⼀個輔助索引,則此索引的結構以下圖所示
image.png
一樣也是⼀顆 B+Tree,data 域保存數據記錄的地址。所以,MyISAM 中索引檢索的算法爲⾸先按照B+Tree 搜索算法搜索索引,若是指定的 Key 存在,則取出其data 域的值,而後以 data 域的值爲地址,讀取相應數據記錄。htm

彙集索引(InnoDB)
主鍵索引(彙集索引)的葉⼦節點會存儲數據⾏,也就是說數據和索引是在⼀起,這就是彙集索引。
輔助索引只會存儲主鍵值
若是沒有沒有主鍵,則使⽤惟⼀索引建⽴彙集索引;若是沒有惟⼀索引,MySQL會按照⼀定規則建立彙集索引。blog

主鍵索引
1.InnoDB 要求表必須有主鍵(MyISAM 能夠沒有),若是沒有顯式指定,則 MySQL系統會⾃動選擇⼀個能夠惟⼀標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL ⾃動爲 InnoDB 表⽣成⼀個隱含字段做爲主鍵,類型爲⻓整形。
image.png
上圖是 InnoDB 主索引(同時也是數據⽂件)的示意圖,能夠看到葉節點包含了完整的數據記錄。這種索引叫作彙集索引。由於 InnoDB 的數據⽂件自己要按主鍵彙集索引

輔助索引(次要索引)
2.第⼆個與 MyISAM 索引的不一樣是 InnoDB 的輔助索引 data 域存儲相應記錄主鍵的值⽽不是地址。換句話說,InnoDB 的全部輔助索引都引⽤主鍵做爲 data 域。
image.png
彙集索引這種實現⽅式使得按主鍵的搜索⼗分⾼效,可是輔助索引搜索須要檢索兩遍索引:⾸先檢索輔助索引得到主鍵,而後⽤主鍵到主索引中檢索得到記錄。
select * from user where name='Alice' 回表查詢 檢索兩次 ⾮主鍵索引 --- pk---索引--->數據
select id,name from user where name='Alice' 不須要回表 在輔助索引樹上就能夠查詢到了 覆蓋索引(多⽤組合索引)
image.pngget

引伸:爲何不建議使⽤過⻓的字段做爲主鍵?
由於全部輔助索引都引⽤主索引,過⻓的主索引會令輔助索引變得過⼤。
同時,請儘可能在 InnoDB 上採⽤⾃增字段作表的主鍵。

MyISAM 和 InnoDB的存儲結構圖示
爲了更形象說明這兩種索引的區別, 咱們假想⼀個表以下圖存儲了 4 ⾏數據。 其中Id 做爲主索引,Name 做爲輔助索引。 圖示清晰的顯示了聚簇索引和⾮聚簇索引的差別:
image.png
image.png

相關文章
相關標籤/搜索