为什么一般单表数据不超过2000万

索引的存储结构

MySQL的InnoDB引擎的索引使用B+树的结构,最小存储单元是页,也就是一个节点,InnoDB引擎默认一个页的大小为16k,页可以用于存放数据也可以用于存放键值+指针,在B+树中叶子节点存放数据,非叶子节点存放键值+指针。
在这里插入图片描述

原因

假设B+树的高度是2,那么存放的总记录数=根节点的指针数 * 单个叶子节点记录行数,假设主键是bigint类型,在MySQL中,bigint占8个字节,指针占6个字节,那么一个主键+指针数=14个字节,一个页大小为16k,那么根节点的主键+指针数=16 * 1024 / 14 = 1170,假设一行记录的数据大小是1k,那么一个页就可以存16行数据,那么总记录数=1170 * 16 = 18720
假设B+树的高度是3,那么存放的总记录数=根节点的指针数 * 二级节点的指针数 * 单个叶子节点记录行数,那么总记录数=1170 * 1170 * 16 = 21902400
查找数据时一次页的查找就是一次IO操作,为了避免多次IO操作造成性能问题,一般树的层级不超过3,因此单表数据量一般不超过2000万。


版权声明:本文为m0_54065725原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。