前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >备战BAT面试-死磕mysql|mysql 是如何做到存储两千万数据毫无压力的?

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

作者头像
AI码师
发布2022-09-19 12:00:37
3540
发布2022-09-19 12:00:37
举报

关注公众号“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
  • 第三层 因为第三层存储有数据,不需要存储指针地址,计算方式与前两层不一样 看到最后,大家应该知道2000万的数值是怎么计算的了!!!
    • 【主键节点】8B
    • 【1kB】预估这么多,已经算很大了
    • 8B相当于1KB可以忽略
    • 所以一个小节点可以存储 16KB/1KB =16 条数据
    • 最终总的存储数据条数为:1170 * 1170 * 16=21902400(2000万)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么说是两千万呢,为什么不说100万,200万呢?
  • 在计算之前,我们先来聊聊mysql底层数据存储结构。
  • 我们看下B+ tree到底长什么样?
  • 知道了b+ tree长什么样之后,我们再看mysql是如何进行查找数据的?
  • 那到底2000万的数字是怎么计算出来的呢?
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档