MySQL 单表的理论最大行数为什么是2000W?

1,894 阅读2分钟

结论:为了尽量减少最耗时的IO操作,达到IO操作 和 存储数据的平衡

背景

在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512B,而文件系统(例如XFS/EXT4)他的最小单元是,一个块的大小是4K,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K

MySQL innoDB 引擎是通过B+树实现的,也就是说B+树的每个节点大小为 16K

目前大多数业务,行记录大小可以控制在 1K 之内

计算

  1. 叶子节点是储存行数的,每个叶子节点可以存 16k/1K =16 行数据

  2. 计算关键点在于非叶子节点

    • 非叶子储存单元:叶子节点指针 + 主键Id
    • 主键Id为bigInt 8B ,指针大小为6B 一个储存单元为 14B
    • 非叶子节点可以存 16384/14 = 1170个数据单元

分析

一个两层的 B+树 存的行数 : 16 * 1170 = 18,720

一个三层的 B+树 存的行数 : 16 * 1170 * 1170 = 21,902,400

一个三层的 B+树,查找某一行记录时,当只有根节点在内存中时需要 两次IO操作;当把第二层 非叶子节点也加载到内存中时 只需要一次IO操作

问题

非叶子节点的存储单元为啥是 叶子节点指针 + 主键Id。 只用叶子节点指针好像也能达到相同的作用,innodb 为何如此设计?

欢迎大家留言讨论