mysql索引結構
mysql索引結構
一頁16K,節點分成2種,也子目錄節點和數據數據。
節點和節點之間有前后指針,記錄只存放下一條記錄的指針
目錄節點里面存放頁類型(是目錄節點還是也節點),最大值和最小值,目錄節點的記錄存放子頁的指針和子頁的最小值。
數據頁節點存放,最大值和最小值,數據記錄存放記錄類型和下一條記錄的指針。
目錄節點記錄里面存的數據很少,主要是指針和最小值,所以一頁數據可以存很多數據,大約1000條。
數據節點記錄里面有只整條記錄,所以存放的記錄數很少根據一行記錄的大小確定能存多少,大約在100條級別。
mysql索引一般不會超過4層(每多一層就多次磁盤IO),更節點一層,數據節點一層,如果有2層目錄節點,那么大約可以存放1000*1000x1000x100=1000億條數據。實際如果目錄節點存的最值是字符類型或者是復合索引,就沒有1000條,數據類型如果一條記錄很大也沒有100條。而且索引每個節點下面的數據不是均勻的,這導致mysql即便是4層結構B+數的時候一般存不到1000億條數據。
所以決定mysql能存多少數據的主要因素是索引字段長度和記錄的長度。
2層b+數結構圖

3層B+數結構圖

上面的圖是聚簇索引(主鍵索引),二級索引數據節點里面存的不是完成的記錄,而是指向聚簇索引數據節點的引用(一般是主鍵ID)。所以二級索引會多一次磁盤IO。
如果是B-tree結構那么目錄節點出了放下節點的地址還要放數據,這樣會導致目錄節點存入的記錄數量變少,所以不適合用于存儲大量的數據,這也是Mysql使用B+tree的原因。并且B+tree的所有數據都放在葉子節點,每條記錄都是通過單項鏈表連接,所以對范圍查詢有利。
能耍的時候就一定要耍,不能耍的時候一定要學。
--天道酬勤,貴在堅持posted on 2025-09-02 17:43 zhangyukun 閱讀(13) 評論(0) 收藏 舉報
浙公網安備 33010602011771號