引子

hello,各位小伙伴,大家好,这篇是mysql的第三篇了,还没看过前两篇的小伙伴可以去看看,对理解这一篇有很大的帮助哦。

废话不多说,我们直接开始正文,作为一名java后端开发工程师,我们都知道,数据库中一张表最大存储数据官方建议是在两千万左右,而业界中,大家普遍认为,数据超过五百万了,就可以考虑分库分表了,也就是说,单表数据一般是不会超过五百万的。

如何分库分表我们下一篇再聊,这篇,叶子主要想和大家聊一下,为什么mysql官方建议单表数据不能超过两千万呢,单表超过了两千万数据会怎么样,公司数据库中表单数据过亿了,为什么查询速度依旧在可接受的范围内。

ok,我们带着这些问题,来和叶子一起看看吧。

为什么官方建议单表数据不要超过两千万?

先看看限制表中数据的因素有哪些?

第一个,我们首先想到的,就是主键了。

我们新建一张表,先不设置主键,数据表中也没有递增。唯一的字段作为主键,这时,这张表就会默认生成一个主键字段,这个字段会被隐藏起来,在表中是看不到的。

默认生成的主键是六个字节 ,我们知道一个字节是八位,2^48-1 换算下来,这是一个很大的数字,到达了兆级,所以,永远不用担心默认的主键不够用。

好了继续往下看 ,主键大小限制表的上限,这也意味着,如果是int类型的主键,单表最大存储21亿多条数据,对于大多数业务场景,这样够用了。

那除了主键之外,还有什么因素限制表中的数据呢?

那肯定是表数据的底层,B+树了,看过上一篇的小伙伴应该知道,InnoDB存储结构是表空间,区,页,行。

上一篇中,我们已经知道了,B+树的数据存储在叶子结点,非叶子结点存储指针和主键,三层B+树就可以存储二千多万条数据,但这是在行数据小于1k的情况下的。

看看这张表,一行行数据紧挨在一起,实际上,在ibd文件中,他们是分成数据页,一个数据页大小是16k。

那我们知道,页空间大小固定为16kb,行数据大小有时候是超过1K的,这个时候,一行数据就会分开放在很多页里,产生页分裂,为了标识这一行数据具体在哪一页,就需要引入页号,实际上就是一个内存地址偏移量。

同时为了把这些数据页给关联起来,于是引入了前后指针,用于指向前后的页。这些都被加到了页头里。

页是需要读写的,16k写一半电源线被拔了也是有可能发生的,所以为了保证数据页的正确性,还引入了校验码。这个被加到了页尾。

页头放完指针,页尾放完校验码,剩下的空间,才是用来放我们的行数据的。

而如果行数特别多的话,进入到页内时挨个遍历,效率也不太行,所以为这些数据生成了一个页目录,具体实现后面再和大家聊。现在只需要知道,它可以通过二分查找的方式将查找效率从O(n) 变成O(lgn)。

如果想要查询一行数据,我们可以把每一页都捞出来,然后挨个去判断表中数据量小,分成的页比较少的时候,这样做没问题。

行数据量大了,性能就会变慢,为了加快速度,每个数据页选出主键id最小的数据,只要他们的主键id和页号,放入到一个新生成的一个数据页中,这个新数据页跟之前的页结构没啥区别,而且大小还是16k。

行总数计算

这里记住这样一个公式, (x ^ (z-1)) * y 。

已知x=1170,也就是一层B+树的指针数量,y=15,这个是指,除去页头页尾,页目录占据的内存空间后,存储数据可用空间。

假设B+树是两层,那z=2。则是(1170^ (2-1)) * 15 ≈ 1.7w

假设B+树是三层,那z=3。则是(1170 ^ (3-1)) * 15 ≈ 2.0kw

这个2.0kw,就是我们常说的单表建议最大行数2kw的由来。毕竟再加一层,数据就大得有点离谱了。三层数据页对应最多三次磁盘IO,也比较合理。

最后,解答一下上一篇提出的问题。

如果我单行数据用不了这么多,用不到1kb,比如只用了250byte。那么单个数据页能放大约65行数据。

那同样是三层B+树,单表支持的行数就是 (1170 ^ (3-1)) * 65 ≈ 九千多万,四舍五入,就是一个亿。

总结

ok,这篇我们深入了解了B+树的底层,以及B+树三层结构最大可以存储多少数据,希望小伙伴们有所收获,最后,不要忘记点赞哦。

mysql单表存放上亿数据,查询依旧很快。相关推荐

  1. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  2. mysql查询学生表的总人数,MySQL(表)-实操数据查询

    MySQL(表)-实操数据查询 MySQL(表)-实操:数据查询 练习1:成绩表筛选 创建成绩表(exam): CREATE TABLE exam( id INT PRIMARY KEY AUTO_I ...

  3. mysql qps提升_上亿数据MYSQL的innodb优化 QPS轻松过5000

    最近2周时间, 对于MYSQL 5.5.15-log Windows XP版本,进行了各种测试和优化.目前mysql的许多单表数据已经超过了1亿条记录,MYSQL在经过各种优化后,处理上亿条记录非常轻 ...

  4. MYSQL 单表删除1000万数据

    先用 select count(*) from 查询数量 再用 DELETE FROM 删除 (注意删除数据过大分批执行更快) 不要一次性的 DELETE FROM   去删除1000万条.会导致死锁 ...

  5. 查询a表有但是b表没有的数据_牛逼!一个上亿数据的报表竟然能做到秒查~

    数据背景 首先项目是西门子中国在我司实施部署的MES项目,由于项目是在产线上运作(3 years+),数据累积很大.在项目的数据库中,大概上亿条数据的表有5个以上,千万级数据的表10个以上,百万级数据 ...

  6. mysql 单表2000多万条数据,模糊查询如何秒回

    mysql 单表数据2000多万,没有分区.没有表.没有分库,表存储的是企业信息,例如:企业名称.经营范围.注册地址等信息.现在需要通过关键词模糊匹配企业名称,搜索出匹配的数据.因为模糊匹配,所以直接 ...

  7. 耗时3天,上亿数据如何做到秒级查询?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:sohu.gg/jIp59N 最近在忙着优化集团公司的一个报 ...

  8. 耗时 3 天,上亿数据如何做到秒级查询?

    最近在忙着优化集团公司的一个报表.优化完成后,报表查询速度由从半小时以上(甚至查不出)到秒查的质变.从修改 SQL 查询语句逻辑到决定创建存储过程实现,花了我 3 天多的时间,在此总结一下,希望对朋友 ...

  9. MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?

    今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行.那么,你觉得这个数值多少才合适呢? 曾经在中国互联网技术圈广为流传着这么一个 ...

最新文章

  1. 5see我看视频交友客户端 v2.3.0.11官方版
  2. 【干货】深入B端SaaS产品设计核心理念
  3. 【好消息】Python和Excel终于可以互通了!!
  4. 字节跳动 Flink 单点恢复功能实践
  5. 又一起删库跑路事件!宕机36小时、损失近10亿,腾讯云还差点背锅...
  6. HttpWebRequest 忽略证书
  7. Response.Write 用法总结
  8. 对佛教大小无别的弦论解释
  9. 基于Nginx+Lua自建Web应用防火墙
  10. “一天搞懂深度学习”笔记
  11. iserdese2接口详解_Xilinx FPGA LVDS应用
  12. 20165107 网络对抗技术 Exp4 恶意代码分析
  13. 从身边的移动支付说起
  14. 苹果的名字测试软件,教你iOS12人脸识别测颜值捷径安装使用教程及iPhone XR修改AppleID姓名教程...
  15. DOM文档树和节点操作
  16. Python - 期货CTP常见问题解答
  17. IE网页出现js错误修复方法_离水的鱼_新浪博客
  18. 金蝶专业版过账提示运行时错误5_金蝶专业版过账提示运行时错误5_金蝶KIS专业版常见故障及解决办法...
  19. 基于tensorflow+CNN的新浪新闻文本分类
  20. 删除无限循环的文件夹。

热门文章

  1. mongodb启动脚本
  2. ps 钢笔工具 路径 常用
  3. 麒麟桌面系统密码忘记重置方法-20200711版本
  4. 1 大道至简的数据处理工具-(Microsoft Power Query入门)
  5. 涂鸦智能python 面试_【招聘】杭州涂鸦智能大前端团队招聘
  6. HTML+CSS之弹性布局
  7. 前端监控与前端埋点方案
  8. WPS文字 左上角 没有WPS文字 那个图片logo
  9. 山东省首版次高端软件申报工作的通知
  10. 另样文字 借你来欣赏