(有许多人是用青春的幸福作成功的代价的。——莫扎特)
B+树
关于B+树的原理请查看这篇文章
分析
MySQL采用了索引组织表的形式组织数据,叶子节点存储数据,非叶子节点存储主键与页面号的映射关系。若用户的主键长度是8字节时,MySQL中页面偏移占4个字节,在非叶子节点的时候实际上是8+4=12个字节,12个字节表示一个页面的映射关系。
MySQL默认是16K的页面,抛开它的配置header,大概就是15K,因此,非叶子节点的索引页面可放151024/12=1280条数据,按照每行1K计算,每个叶子节点可以存15条数据。同理,三层就是151280*1280=24576000条数据。只有数据量达到24576000条时,深度才会增加为4,所以,索引深度没有那么容易增加,详细数据可参考下表。
索引深度 | 最大数据量(行数) |
---|---|
1 | 15 |
2 | 19200 (15*1280) |
3 | 24576000 (1512801280) |
4 | 31457280000 (1512801280*1280) |
结论
超出这个数据量后,随着树层数的增加,IO查询的次数也会增加,性能也会降低。但为什么都说是到2500w之后才出现呢?因为单表达到千万级数据量的业务较少,在这个阶段就会因为数据量的增多而发现性能问题。