关注公众号“AI码师”领取2021最新JAVA面试资料一份
为什么说是两千万呢,为什么不说100万,200万呢?
这个当然不是乱说的,是通过计算得来的,我接下来会在文章里面告诉大家这个数据是如何计算的。
在计算之前,我们先来聊聊mysql底层数据存储结构。
mysql 经常使用的存储引擎是Innodb,数据结构算法用的基本都是B+ tree,当然熟悉mysql同学肯定知道除了B+ tree之外,mysql使用数据结构算法还有hash等,不过文章中的计算方式主要是针对b+ tree这个数据结构的存储方式。
我们看下B+ tree到底长什么样?
b+ tree 一般深度为3
其中叶子节点存储了所有节点信息
数据都是存储在叶子节点
叶子节点通过双向链表进行连接,并且是按顺序进行排序
知道了b+ tree长什么样之后,我们再看mysql是如何进行查找数据的?
假如我们想找id为21的数据:
首先加载第一页的数据
可以定位到数据在18-30部分,找到指针A
然后根据指针A对应的内存地址,加载对应页面内存数据到内存中
然后再定位到数据在20-22部分,找到指针E
直接加载E对应内存地址的数据
最后定位到id为21对应的数据
可以看出,在mysql中定位一个数据,最多查找3次,就能找到对应的数据,可见B+ tree的数据结构是多么强大?
说了这么多,我们好像还没有进入今天的正题哦。
那到底2000万的数字是怎么计算出来的呢?
在mysql中,将一个大节点作为一页,mysql每次加载一页数据到内存中
页大小被定义为16KB,这是mysql建议的数值,也可以进行配置。
mysql把这样一对数据称为小节点,小节点的数据占用空间可以这么计算
【18】 主键节点 整型 8B(8字节)
【A】指针节点,内存定址最大范围为6B
加起来6B+8B = 14B
那么一个大节点可以存储多少个小节点呢?
小节点数量:16KB/14B = 1170
那这么计算下来:
第一层 存储1170个小节点
第二层 每个小节点又存储1170个节点,总共 1170*1170
第三层 因为第三层存储有数据,不需要存储指针地址,计算方式与前两层不一样
【主键节点】8B
【1kB】预估这么多,已经算很大了
8B相当于1KB可以忽略
所以一个小节点可以存储 16KB/1KB =16 条数据
最终总的存储数据条数为:1170 * 1170 * 16=21902400(2000万)
看到最后,大家应该知道2000万的数值是怎么计算的了!!!
福利大放送
关注微信公众号“AI码师”,领取面试资料和最新全套微服务教程