欢迎关注作者微信公众号:编程大椰子
InnoDB中B+树结构:
B+ 树大致结构:
InnoDB 使用 B+ 树来构建索引, B+ 树只有叶子节点才会存储行数据,非叶子节点存储的是索引和页指针。
InnoDB 数据存储在 tableName.ibd 的文件中,它里面存储的就是一个个的页,页是 InnoDB 最小的存储单位,一页的默认大小是16KB
, 所以文件的大小始终为16KB
的整数倍,每次 MySQL 从磁盘中读取数据都是按照页来读取的,即使你查询一条数据,也会读取一页的数据。
tableName.frm
: 表定义文件,描述的事表名,列名,列的类型,列大小等信息。
tableName.ibd
: 表的索引和数据文件,大小为 16KB 的整数倍。
查看 MySQL InoonDB 默认页大小:
show global variables like 'innodb_page_size';
计算
先计算根节点可以存放多少数据,根节点只存放索引和页指针,假如使用 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)等信息,上文并没有将这些数据计算在内。
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。