Mysql索引、page、B+tree可存行數判斷

有很多關於Mysql索引選擇B+Tree的文章,就不做累述,這篇文章主要介紹關於B+Tree中可以保存大概多少列的索引信息,本文儘量基於官網介紹含出處。

page

個人理解:與linux中內存讀取緩存一樣,爲了批量的緩存數據到內存中,設置的一個IO讀取的最小單位值的符號。

出處:https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_page_size

innodb的page大小

也就是緩存讀取數據時的最小數據量,一般爲16KB。

出處:同上

本地Mysql測試顯示

16384原因:

 

出處:https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_page_size

page的類型

這個是Mysql5.6的,高版本Mysql5.8

本文僅僅關注B樹節點,也就是Mysql使用的索引結構B+Tree中一個節點所佔的空間大小。

出處:

https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-page-lru-table.html

https://dev.mysql.com/doc/refman/5.6/en/innodb-buffer-page-lru-table.html

 

B+Tree

關於B+Tree的基本知識就不做過多介紹了,可以查看別的博客,本文主要關於B+tree的節點可保存的索引數做補充介紹

mysql索引基礎知識準備

1、B+tree的節點保存的信息主要分爲:指針(存儲子節點位置信息)、鍵值(具體索引的值)、數據(表記錄中除主鍵外或是僅僅主鍵的數據)

2、Mysql索引,若使用非主鍵索引,那麼B+tree的葉子節點保存的的爲主鍵信息,然後根據主鍵信息做回表操作,查詢具體數據信息;若使用主鍵信息,則B+tree的葉子節點保存的是除主鍵外的全部數據。(以上描述,僅僅是大致的描述,並不是很具體,若想詳細瞭解關於索引,回表等知識,可自行詳細尋找相關博客)

以上是基本知識若不瞭解,請了解後再看後續內容。

B+Tree的節點大小由上文可知默認是16KB,那麼節點數是多少。首先假設B+Tree是三層,那麼若一個節點可保存3條數據的話,那麼整個B+tree大概可以保存3*3*3的數據總量(僅僅大致)

首先我們計算一個節點可保存的數據量:假設我們長度爲8個字節的bigint類型爲id的類型,每個數據包含6字節的指針,那麼不考慮除葉子節點保存的數據。那麼在一層和二層的節點中,可以大概保存16*1024/(8+6)約爲1000。那麼一二層的節點數最多可保存1000*1000的列數據信息  ,也就是100萬。

      第三層因爲含有data數據,所以不僅僅是索引和指針,若索引爲主鍵索引索引,保存全部數據的話佔用的空間肯定會比較大,若是非主鍵索引的話,僅僅保存主鍵信息,肯定相對比較少(但是在一二層的數據可能就會比主鍵大),所以我們均衡考慮,已主鍵索引考慮,假設一條列數據,佔用0.5K數據,那麼一個節點可保存16/0.5爲32個數據。那麼總的也就是可保存大概三千萬個數據。這僅僅是第三層,若是四層的話,數據量更大,就不做累述了,所以一般Mysql索引數的高度爲3到4層。若是數據量更大,可能更多的會考慮分庫分表等集羣操作。

以上就是關於B+Tree的可保存列數的大致計算

總結:

mysql使用的B+Tree索引樹,僅僅三層就可保存上千萬的列數據信息,所以使用B+Tree來做Mysql的索引樹結構

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章