索引是一種加快查詢速度的資料結構,常用索引結構有hash、b-tree和b+tree。本節通過分析三者的資料結構來說明為啥mysql選擇用b+tree資料結構。
資料結構
hash是基於雜湊表完成索引儲存,雜湊表特性是資料存放是雜湊的。
優點:等值查詢快,通過hash值直接定位到具體的資料。
缺點:範圍查詢效率低(表中的資料是無序資料,在日常開發中通常需要範圍查詢,該情況下hash需要乙個乙個查詢後合併返回)
hash表在使用的時會將所有資料載入到記憶體,比較消耗記憶體
hash演算法不好會出現hash碰撞的情況
雜湊索引只包含雜湊值和行指標,而不儲存字段值,索引不能使用索引中的值來避免讀取行
雜湊索引不支援部分列匹配查詢,雜湊索引是使用索引列的全部內容來計算雜湊值
b-tree特點:
所有鍵值資料分布在整棵樹各個節點中
搜尋有可能在非節點結束,在關鍵字全集內查詢,類似二分查詢
所有葉子節點都在同一層,並且以公升序排列
b+tree
b+tree 是在b-tree的基礎之上做的一種優化,變化如下:
b+tree 非葉子節點不存放資料
葉子節點儲存關鍵字和資料,非葉子節點的關鍵字也會沉到葉子節點,並且排序
葉子節點兩兩指標相互連線,形成乙個雙向環形鍊錶(符合磁碟的預讀特性),順序查詢效能更高
mysql為什麼選擇b+tree
mysql官網文件中寫到innodb索引用的是 b-tree,但是底層用的是b+tree。mysql儲存資料是以頁為單位,預設乙個頁可以存放16k資料。假設b-tree和b+tree都是3層深度,表中每個記錄為1k(假設的,一般不會這麼大,別較真),那麼三層深度的b-tree儲存 16 x 16 x 16 = 4096(比這個數還要少,因為每個頁中還要存放指標和其它的資料)。b+tree第
一、二層存放的是key,假設是long型別的主鍵,那麼第
一、二層每頁存放資料約為 16 x 1024 / 8 = 2048,三層深度可以存放 2048 x 2048 x 16 = 6700w。mysql查詢過程是按頁載入資料的,每載入一頁就是一次io操作,b+tree進行三次io可以查詢6700w資料量。從這裡也可以知道mysql一般設定三層深度就足夠了。
python自學可以嗎 可以自學python嗎?
可以的。既然搜尋到這個問題了,說明想學python,想進入程式設計師這個行業裡來。只要有目標了,想學了,那就肯定可以學。自學python的話,有很多種方式,可以買本書,按照書上講的知識點,一點點學習。這樣效率會慢一些,如果不理解的地方很難有人給你解釋。再就是可以報乙個python的班,跟著老師一起學...
軟考考試自學可以嗎?
很多人在報名軟考的時候會有這樣乙個疑問,我報名了可以自學嗎?在這裡給大家分析下,看你到底適不適合自學。先說說為什麼會有報班這個選項,因為軟考報名是無門檻的,非科班 零基礎也可以報考,就有很多人對計算機知識一無所知,而計算機那些知識有些比較難以理解,有些還會需要有專案經驗,需要會語言。這些有時候靠自己...
軟考考試自學可以嗎?
很多人在報名軟考的時候會有這樣乙個疑問,我報名了可以自學嗎?在這裡給大家分析下,看你到底適不適合自學。先說說為什麼會有報班這個選項,因為軟考報名是無門檻的,非科班 零基礎也可以報考,就有很多人對計算機知識一無所知,而計算機那些知識有些比較難以理解,有些還會需要有專案經驗,需要會語言。這些有時候靠自己...