关注公众号“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码师”,领取面试资料和最新全套微服务教程