InnoDB 中一颗 B+ 树可以存储约多少行数据

2,069 阅读2分钟

欢迎关注作者微信公众号:编程大椰子

InnoDB中B+树结构:

B+ 树大致结构:

B+树索引.png

InnoDB 使用 B+ 树来构建索引, B+ 树只有叶子节点才会存储行数据,非叶子节点存储的是索引和页指针。

InnoDB 数据存储在 tableName.ibd 的文件中,它里面存储的就是一个个的页,页是 InnoDB 最小的存储单位,一页的默认大小是16KB, 所以文件的大小始终为16KB的整数倍,每次 MySQL 从磁盘中读取数据都是按照页来读取的,即使你查询一条数据,也会读取一页的数据。

ibd.png

tableName.frm: 表定义文件,描述的事表名,列名,列的类型,列大小等信息。

tableName.ibd: 表的索引和数据文件,大小为 16KB 的整数倍。

查看 MySQL InoonDB 默认页大小:

show global variables like 'innodb_page_size';

innodb_page_size.png

计算

先计算根节点可以存放多少数据,根节点只存放索引和页指针,假如使用 bigint 做索引,那就占用8字节,InnoDB中指针大小为6字节,这样总共占用8+6=14字节,那么一页中就有会16384/14=1170条这样的数据,就会有1170个页指针,相当于有1170个叶子节点。

再计算子节点可以存放多少数据,子节点存放的是行数据,假设一行的数据大小为1K,那一页就可以存放16k/1k=16条数据。

根据以上基础,就可以很容易算出 B+ 树可以存储多少数据:

层高为 2 的 B+ 树可以存放:1170*16=18720条数据。

层高为 3 的 B+ 树可以存放:1170*1170*16=21902400条数据,约2千万。

InnoDB 中 B+ 树高为 3 就可以存下千万数据,根据索引查找最多也只需 3 次 I/O(在磁盘查找页的次数)操作即可查询到数据,可见 B+ 树的效率很高了。

上文中只是粗略计算,一个页中还会存储很多信息,比如页目录(Page Directort),页头(Page Header),文件头(File Header)等信息,上文并没有将这些数据计算在内。

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿