1. 程式人生 > 其它 >【筆記】mysql index

【筆記】mysql index

索引

索引是增長資料庫查詢效率的一種自排序的資料結構
在mysql中,是利用一種名為“B+ tree”的資料結構來組織索引資料的
大概如圖所示:

這種是二叉樹,又不完全是二叉樹的資料結構,最大不同是儘可能在一個節點放置多的元素,從而來控制樹的高度。樹的高度越高,磁碟IO的開銷就越多,查詢效率隨之降低,這就是mysql不用二叉樹、紅黑樹來構建索引的原因。

那麼用Hash表,或者b-樹呢?

Hash這種資料結構查詢效率固然很高,一次就可以定位到索引值,但是它無法支援範圍查詢,無法支援資料排序,不能很好的支援組合索引
b-樹又如何?
b+樹對b-樹的優化,最大的不同點在於,b-樹的節點中既存索引又存記錄,b+樹除了葉子節點以外只存索引,這樣來看b+相對於b-,一頁儲存和讀取的索引更多,單次磁碟IO的效率更高,磁碟IO次數也要降低。
還有,b+樹的葉子節點通過雙向指標維護了相鄰兩個節點的記憶體地址,b-樹則沒有這樣的特徵,這決定了b+樹更好的支援了大範圍查詢。

聚集索引和非聚集索引

聚集和非聚集索引,是由索引是否和資料分離來決定的。
比如說myisam儲存引擎,它的索引和資料是分開存放的,b+樹的葉子節點與索引存放一起的是資料的訪問地址。
對於Innodb來說,除了主鍵索引以外,其他二級索引都是非聚集索引,二級索引構建起來的b+樹,葉子節點中與索引存放一起的是主鍵索引,相當於是通過二級普通索引先定位到主鍵索引,再根據主鍵索引查詢到資料。這一過程也叫做回表
那麼如果建表沒有指定主鍵,mysql底層將維護一個隱藏列來充當聚集索引。不過照目前主流的開發規範,我們必須手動的指定一個自增的整型的欄位來作為主鍵。