备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?

关注公众号“AI码师”领取2021最新JAVA面试资料一份

备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?_第1张图片

为什么说是两千万呢,为什么不说100万,200万呢?

备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?_第2张图片
这个当然不是乱说的,是通过计算得来的,我接下来会在文章里面告诉大家这个数据是如何计算的。

在计算之前,我们先来聊聊mysql底层数据存储结构。

mysql 经常使用的存储引擎是Innodb,数据结构算法用的基本都是B+ tree,当然熟悉mysql同学肯定知道除了B+ tree之外,mysql使用数据结构算法还有hash等,不过文章中的计算方式主要是针对b+ tree这个数据结构的存储方式。

我们看下B+ tree到底长什么样?

备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?_第3张图片

  • b+ tree 一般深度为3

  • 其中叶子节点存储了所有节点信息

  • 数据都是存储在叶子节点

  • 叶子节点通过双向链表进行连接,并且是按顺序进行排序
    备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?_第4张图片

知道了b+ tree长什么样之后,我们再看mysql是如何进行查找数据的?

假如我们想找id为21的数据:

  • 首先加载第一页的数据

  • 可以定位到数据在18-30部分,找到指针A

  • 然后根据指针A对应的内存地址,加载对应页面内存数据到内存中

  • 然后再定位到数据在20-22部分,找到指针E

  • 直接加载E对应内存地址的数据

  • 最后定位到id为21对应的数据

可以看出,在mysql中定位一个数据,最多查找3次,就能找到对应的数据,可见B+ tree的数据结构是多么强大?

说了这么多,我们好像还没有进入今天的正题哦。

备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?_第5张图片

那到底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码师”,领取面试资料和最新全套微服务教程
在这里插入图片描述

你可能感兴趣的:(技术专栏,数据结构,mysql,java,面试)