y十四:单表最大行数据腾讯云开发者社区

在互联网技术圈中有一个说法:「MySQL 单表数据量大于 2000 W行,性能会明显下降」。网传这个说法最早由百度传出,真假不得而知。但是却成为了行业内一个默认的标准。

单表超过2000W行数据一定会导致性能下降吗?我认为是不一定的,虽然说建议单表不超过2000W,但是我不接受它的建议可不可以?那必然也是可以的。

先来看看下面这张图,了解一下mysql各个类型的大小

我们知道在MySQL是支持主键自增长的,不考虑其他因素的前提下,理论上只有主键没有用完,表中的数据就可以一直增加。从上图可以中可以分析出:

「由此可見:MySQL能够存储的数据在一定程度上受限与主键的类型。但是数据量的大小却跟2000W没啥影响,既然百度大佬推荐单表最大2000W行数据,那肯定不会是空口白话,一定定会有其他影响行数的因素」。

先不要着急,影响数据行数的因素肯定是有的,在此之前,先来看看数据在InnoDB中是怎么存储在磁盘的,又是怎么读取的。

从上图中可以很清晰的看出,「一个.ibd文件文件是由多个数据页组成的,也就是说一个表的数据会被分散存储在多个数据页中」。当然数据页也不仅仅只是存储表中的数据,先来回顾一下页的组成

如图所示,InnoDB数据页由以下七个部分组成,

从也得组成中我们知道,「数据页中还存储了除数据之外的东西,比如数据页的前后指针,页号,页目录等,因此虽然一个数据页一共16KB,但是能够用来存储数据的其实是不足16KB的」 。

通过页的组成,我们可以大致分析在数据页中一下「查找数据的整体过程」:

既然在.ibd文件中只要知道了页号,就可以快速定位数据行的位置,从而读取到相应的数据。那么问题来了,我咋知道我要找的数据在那个数据页里,咋知道页号是啥?

万事都有解决的方式,要知道页号其实也简单,无非就两种方式:

根据这张B+tree的图,我们知道数据页之间是有地址指向的,如果要找一条数据,最多只需要经历三次「磁盘IO」就可以将数据页都加载到内存中,从而找到数据,完成查询。

要知道一个B+Tree能存储多少数据其实也不难,B+Tree中的叶子节点存放的是数据,而一个数据页只有16K,我们「假设:数据页中页目录,页头,页尾加起来总共占用1KB,剩余15KB全部用了存放数据」。

如上图:

根据以上定义,B+tree存储的数据总量:「M ={X ^ (N-1)} * Y」

前文中我们说到主键类型会影响行数,那么此时我们「假设主键类型为bigint类型,占8个字节,而在InnoDB源码中页号(FIL_PAGE_OFFSET)被设置为4字节」。则此时非叶子节点能存储的数据量为

「X = 15 * 1024 / (8 +4) = 1280」

前面已经将目录,页头,页尾作为1KB排除,所以这里是15

「基于此:在来做一个假设,假设叶子节点中存储的数据,每条的大小都为1KB,即每个数据页存储15条数据。」

「Y = 15」

现在来看看B+tree的数据量

「从这里的24579000条,我们就知道为啥单表不推荐超过2000W了,三层B+tree的时候最多只有三次磁盘IO,四层的时候数据量太大,磁盘可能都造不住了」。

不知道大家有没有注意到一点,在上面计算中,我们都是做了很多假设,其中就有一条:「假设叶子节点中每条数据占用1KB,以此得出一个数据页的数据量Y=15」。

在实际中,要是我一行的数据非常小,仅仅只占用了100KB(比如一个中间表,记录的仅仅是ID),此时

「同样是三层B+tree,此时却可以存储2.5亿条数据,增长十倍,但是查找同样只需要三次磁盘IO,并不会对性能有太大影响」。

这里说的「是【叶子节点】数据页的数据行大小」影响了最终存储的数据总量,「实际上【非叶子节点】的数据页存储数量X的大小变化的时候」,也会影响数据总量,但是这种影响一般会在B-tree中体现。

我们知道B-tree跟B+tree最大的区别就是「B-tree的非叶子节点中存储的是真实的数据行,而数据页的大小是16KB固定的,因此相同数据下,B-tree需要更多数据页才能存储数据,数据页增多势必会造成非叶子节点的层级变高,造成更多的磁盘IO,导致性能下降」。这也是InnoDB使用B+tree作为索引结构,而不用B-tree的原因。

THE END
0.MySQL索引与页结构页结构图 图示说明: 1111a,分别表示col1,col2,col3,col4,col5 五列数据。红色标记为以主键构造的主键索引,也为聚簇索引。 用户数据区:数据为链表结构,对于链表结构而言,插入性能较高,而查询性较低,因此这个链表的长度不会很长,那么mysql是怎么解决这个问题的呢?当然是通过页目录来解决。 jvzquC41dnuh0lxfp0tfv8|gkzooa=95::<9;8ftvkimg8igvcomu86487=54:8
1.国内超大索穹顶张拉完成,坚朗自主研发智慧索首次应用特别是,光纤光栅智慧索凭借监测精度高、量程大、耐久性好、抗电磁干扰、信号容量大和损耗小的优点,首次被成功应用于三个场馆中,开启国内索结构体系健康监测的新纪元。 坚朗五金自2018年项目设计之初,便积极参与建筑方案选型、结构参数设计、张拉施工模拟分析、节点深化设计等全链条工程配合,并持续加大自主研发力度,开发出jvzquC41fyixd7hqo1tfy|nphq537=57494ivvq
2.珠江科学大讲堂第121讲:中国天眼与南仁东的故事如何建设?柔性网索结构实现反射面变位 姚蕊还介绍说,在20世纪90年代,中国已有的射电望远镜最大直径仅有25米,而美国的Arecibo射电望远镜经过扩建后直径达到了350米。而直径越大,射电望远镜的灵敏度则越高,灵敏度直接决定了能“看到”多暗的信号。因此,如果我们想看到别人看不到的信号,就要建直径更大的射电望远镜。jvzquC41pg}t0‚hyd0ipo872463168761euovnsva7876<6970nuo
3.岗位上的坚守!“五一”施工不打烊他们坚守在一线抢工期荆楚网五一期间,由中建八局东北公司承建的大连梭鱼湾足球场项目仍是机械轰鸣、一派繁忙景象。目前,项目建设者们经过177天努力施工,在昨天上环索提升、撑杆安装、拉索提升、交叉索施工的目标如期完成。 中建八局东北公司大连梭鱼湾专业足球场项目经理 么德生:今天我们完工的是体育场屋面罩棚索结构体系,是本工程最为重要的分项jvzq<84pgyy/ewmwdgo/exr1eqtugwy14283/9:1245dqwygpve26@6742;/j}rn
4.索引的原理·数据库·看云索引是一种利用某种规则的数据结构与实际数据的关系加快数据查找的功能;索引数据节点中有着实际文件的位置,因为索引是根据特定的规则和算法构建的,在查找的时候遵循索引的规则可以快速查找到对应数据的节点,从而达到快速查找数据的效果;其实宏观来说索引其实是一种概念而不是具体的某项技术,只是我们在某个技术中运用得比jvzquC41yy}/mjsenq{e0ls1htkzc9531fguckfug182:B<66
5.土木工程学院主要从事大型复杂土木工程结构分析和施工技术的教学和科研工作,致力于大跨空间预应力索结构的分析、设计、施工和测试技术及工程应用的研究,主持和参与的科研项目有:科技部“应用于FAST反射面闭环控制的实时仿真系统”、“基于塔架提升索杆累积安装的索穹顶施工关键力学分析和技术研究”和“基于向量式有限元的预应力空间结构jvzquC41ek|jn7xgw0kew7hp1nh0nrxv0jzn
6.LiuHongbo本科生课程《通用结构分析软件》 本科生课程《现代预应力结构》 研究生课程《大跨度建筑结构体系》 主要学术兼职: 1) 中国钢结构协会 理事 2) 中国建筑金属结构协会铝结构分会 秘书长 3) 中国钢结构协会结构稳定与疲劳分会 理事 4) 中国钢结构协会空间结构分会索结构专业委员会 委员 jvzq<84liz/vsz0gf{/ew4kphu03:9;14=777mvo
7.《MySQL高级篇》四索引的存储结构mysql索引存储结构《MySQL高级篇》四、索引的存储结构 本文详细解析了数据库索引的原理,包括B+树的构建与优化,聚簇索引与非聚簇索引的区别,以及MyISAM和InnoDB存储引擎的索引实现。讨论了索引的优缺点,指出索引在提高查询效率的同时,也会增加存储空间和维护成本。此外,还提到了哈希索引和R树等不同类型的索引结构及其适用场景。最后,强调了合理选择数 jvzquC41dnuh0lxfp0tfv8fufhgecoi1ctzjeuj1fgzbkux134<16;>23
8.sql索引的介绍以及使用规则详析Mysql3。如果表没有主键,或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索 引。 聚集索引和二级索引的具体结构如下图所示。 聚集索引的叶子节点下挂的是这一行的数据 , 二级索引的叶子节点下挂的是该字段值对应的主键值。 执 行如下的 SQL语句时,具体的查找过程如下所示。 具体过程如下: 1jvzquC41yy}/lk:30pku1jwvkerf1;<;;6:/j}r