mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我
聽說微信搜索《Java魚仔》會變更強哦!
本文收錄于JavaStarter ,里面有我完整的Java系列文章,學習或面試都可以看看哦
(一)關于索引
索引是幫助Mysql更加高效獲取數據的一種數據結構,索引的使用很簡單,但是如果不能理解索引底層的數據結構的話,就談不上去優化索引了。
(二)B+樹
Mysql的索引用的是B+樹,他具有這樣的幾個特點:
1、數據都存儲在葉子節點中、非葉子節點只存儲索引
2、葉子節點中包含所有的索引
3、每個小節點的范圍都在大節點之間
4、葉子節點用指針相連,提高訪問性能,比如條件是>或者<的查詢就可以直接按指針找(Mysql中的B+樹葉子節點中的指針是雙向指針)
B+樹的數據結構如圖所示,首先非葉子節點只存儲索引,且每個指針所指向的節點最左邊的索引都是該指針對應的索引值,比如頭節點的第一個索引值8,指向的非葉子節點的第一個索引值也是8。
(三)為什么索引這么快?
索引可以支撐千萬級表的快速查找,為什么呢?下面就來解釋一下:
show GLOBAL STATUS like 'Innodb_page_size'
在Innodb中,默認的innodb_page_size大小為16kb,這就相當于上面每一個節點的大小默認情況下是16kb。一個索引值的大小為8B,索引后的指針所占大小為4B,因此可以解算出一個節點中大約可以存儲1170個索引。
對于葉子節點,由于存儲了數據,我們可以大方地估計每個數據的大小為1kb,相當于在葉子節點中每個節點可以存儲16個數據。
這樣就可以計算出一個三層的B+樹結構的索引一共可以存儲1170117016=2190萬條數據,這就意味著只需要三次磁盤IO,就可以檢索兩千萬條數據,由此可見索引可以支撐千萬級表的快速查找。
(四)Innodb索引的實現
Mysql中的存儲引擎有Innodb和Myisam兩種,兩種索引的實現底層雖然都是B+樹,但是實現形式還是略有不同。
Innodb屬于聚簇索引,即葉子節點包含了完整的數據記錄。下面這張圖是innodb的主鍵索引,所有的數據都放在葉子節點中。
Innodb要求表必須有主鍵,并且推薦使用整型的自增主鍵,這也和他索引的實現有關,使用整型可以更好的進行B+樹的排序,同時采用自增的方式可以在插入數據時將數據插入到最后一個節點的后一個,而不用對已產生的索引拆分。
非主鍵索引和主鍵索引略有不通,非主鍵索引的葉子節點存儲的是主鍵的key值:
采用這種方式保持了數據的一致性,當新增一條數據時,只需要在主鍵索引處修改數據即可,而不會出現每個索引各自維護的情況。第二個優勢是節省了存儲的空間,數據只需要保存一份即可。
(五)MyIsam索引的實現
Myisam索引文件和數據文件是分離的,在MyIsam存儲引擎中,新建一張表后會在磁盤中增加三個文件:
.frm 文件存儲的是表結構,.MYI文件存儲的是B+樹的索引表,MYD存儲的是數據,我通過下面這張表展示MyIsam索引:
(六)總結
關于數據庫的索引,絕對是工作中常用,面試常考的問題,他太重要了。理解索引底層數據結構更加重要,這是后續優化的基礎,好了,我們下期再見!
總結
以上是生活随笔為你收集整理的mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学生计算机二级大集报名最好,在校大学生
- 下一篇: 使用OC进行iOS截屏,同时保证清晰度