有很多关于Mysql索引选择B+Tree的文章,就不做累述,这篇文章主要介绍关于B+Tree中可以保存大概多少列的索引信息,本文尽量基于官网介绍含出处。
个人理解:与linux中内存读取缓存一样,为了批量的缓存数据到内存中,设置的一个IO读取的最小单位值的符号。
出处:https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_page_size
也就是缓存读取数据时的最小数据量,一般为16KB。
出处:同上
本地Mysql测试显示
16384原因:
出处:https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_page_size
这个是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的节点可保存的索引数做补充介绍
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的索引树结构