645 字
3 分钟
面试鸭-MySQL三层B+树能存多少数据?

MySQL三层B+树能存多少数据?#

大概可以存2000万条数据,我是这样算的: 假设主键是BIGINT类型,占8个字节。指向子节点的指针占6个字节,然后每个页是16KB的大小,那么非叶子节点就可以存储16KB/14B数量的索引,也就是大概1170个,假设行数据占1kb,那么一个叶子节点就可以存16条数据,那么总共就是1170*1170*16 大约是2100万左右的数据。

但是这个数值并不是固定的 如果行数据更小,就可以存储更多。

问题:#

如果主键用 uuid 字符串代替 bigint,对存储量有什么影响?#

会很大程度减小存储量。因为非叶子节点存储的是主键和指针,若使用BIGINT类型的主键,主键大小只占8个字节,加上6字节指针,一个16kb的页可以存储1170个索引。换成uuid是36个字节,一个16kb的页大概只能存390左右个索引,三层存储的量减少到大概240w条左右,比原来少了一个量级。并且二级索引非叶子节点也存储了主键值,所以也会影响到二级索引。

二级索引的三层B+树能存多少数据?#

二级索引的叶子节点存储的是主键+索引类型的值,假设这个索引的类型也是BIGINT占8个字节,那叶子节点就可以存16kb/16b 也就是1024条数据。那么总的就是1170*1170*1024条,是10亿量级的数值。所以二级索引可以支撑的数据量很大,但是查一些上面没有的数据时需要回表。

表数据量超过2000万就要分库分表吗?#

不一定,这个要看实际情况,关键是要看实际查询性能是否满足业务需求。真正需要分表的情况是:慢查询明显增多、单表写入QPS顶不住、磁盘空间不足。一般能不分就不分,分了会增大复杂度。

innodb_page_size 什么时候需要调整?#

若数据行非常小,就可以考虑调小默认页的大小,以此提高内存利用率。若数据行很大,比如宽表创建,就可以考虑调大,跳到32KB,但是这个是要在初始化数据库时去设置的,设置后就不能改了,要慎重考虑。一般情况下16kb的页大小是兼顾了效率和使用完全足够了。

面试鸭-MySQL三层B+树能存多少数据?
http://www.shineacz.top/posts/面试鸭-mysql三层b树能存多少数据/
作者
shineAcZ
发布于
2026-03-12
许可协议
CC BY 4.0