mysql索引數據結構


什么是索引?索引就是排好序的數據結構,可以幫助我們快速的查找到數據

推薦一個網站,可以演示各種數據結構:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

 ---------------------------------------------------------------

圖解幾種數據結構:

二叉樹:如果數據是單邊增長的情況 那么出現的就是和鏈表一樣的數據結構了,樹高度大

 

紅黑樹:在二叉樹的基礎上多了樹平衡,也叫二叉平衡樹,不像二叉樹那樣極端的情況會往一個方向發展。

 

 

同樣我們查找6,在二叉樹中我們需要經過6個節點才能找到(1-2-3-4-5-6),紅黑樹中我們只需要3個節點(2-4-6),但是mysql索引的數據結構並不是紅黑樹,因為如果數據量大了之后,樹的高度就會很大。

 

B樹:在紅黑樹的基礎上,每個節點可以存放多個數據

這個時候我們查找6 只需要2個節點就可以了,而且樹的高度也比紅黑樹矮。

B+樹:B樹的變種

你會發現非葉子節點是會重復的,就像上面4,在葉子節點上面也出現了4,這是為什么呢?因為它需要在葉子上面存放數據。那又是怎么存放數據的呢?

 ---------------------------------------------------------------

mysql索引為什么用B+樹

首先說一點,mysql索引的數據結構就是用到的B+樹。

 

MyISAM存儲引擎索引文件和數據文件是分離的

 Usertabmyisam表使用的myisam存儲引擎,表相關文件有三個,.frm是存放表結構數據,MYD是表數據。MYI是存放索引,索引樹上會存儲數據在MYD文件里面的位置。

InnoDB存儲引擎

Usertab使用的Innodb存儲引擎,表相關文件只有兩個同樣.frm文件是存放表結構數據,.ibd存放的數據和索引。

表數據文件本身就是按B+Tree組織的一個索引結構文件,主鍵索引葉節點包含了完整的數據記錄

以InnoDB為例:

數據是放在主鍵索引上面,也就是說實際上在每個節點上還會存放所有的數據

使用B樹存放數據之后實際是這樣子的,會在每個對應的索引列的值上存放上對應的數據

而B+樹則不同,它只會在葉子節點上面掛載數據,非葉子節點不會存放數據,數據只會存在葉子節點上面,非葉子節點只存放索引列的數據

 

這樣一個節點就可以存放很多個索引列數據,一次IO就可以拿到很多數據,mysql默認的一個節點16K的大小,可以通過show global status like "Innodb_page_size" 看到該值是16384,每次IO讀取16K大小的數據,以索引列是bigInt類型為例,大小8字節,每一條數據還有一個指向下一層的指針6字節,16384/(8+6)=1170,一個節點就大約可以存1170條數據。

以一個層高為3的樹為例,葉子節點存放數據之后大小1KB,那么這個樹可以存放 1170 *1170 *16 =21,902,400,大約2200萬條數據。所以在這種千萬級的表中通過主鍵索引查找一條數據,最多3次IO就可以找到一條數據。而很多時候樹的根節點基本都是在內存中,所以多數時候只需要2次IO。

葉子節點之間也有雙向指針連接,提高區間范圍性能,范圍查找。

創建索引的時候,可以選擇索引數據類型,一個是btree一個是hash,hash查找當然也快,但是當遇到范圍查找的時候hash就尷尬了,所以根據實際業務需求來看是用btree還是hash。

  ---------------------------------------------------------------

主鍵索引三問

為什么非主鍵索引結構葉子節點存儲的是主鍵值?

一是保證一致性,更新數據的時候只需要更新主鍵索引樹,二是節省存儲空間。

為什么推薦InnoDB表必須有主鍵?

保證會有主鍵索引樹的存在(因為數據存放在主鍵索引樹上面),如果沒有mysql會自己生成一個rowid作為自增的主鍵主鍵索引

為什么推薦使用整型的自增主鍵?

一是方便查找比較,而是新增數據的時候只需要在最后加入,不會大規模調整樹結構,如果是UUID的話,大小不好比較,新增的時候也極有可能在中間插入數據,會導致樹結構大規調整,造成插入數據變慢。

 ---------------------------------------------------------------

聯合索引

可以理解成把幾個字段拼接起來的一個普通索引

聯合索引使用,按照建索引的順序字段來比較使用,參照左前綴原則。

 

更多數據結構:

高級數據結構---二叉樹

高級數據結構---二叉查找樹及其增刪改查實現

高級數據結構---紅黑樹及其插入左旋右旋代碼java實現

高級數據結構---赫(哈)夫曼樹及java代碼實現

高級數據結構---堆樹和堆排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM