MySQL十四:单表最大2000W行数据

23 篇文章 24 订阅
订阅专栏
18 篇文章 13 订阅
订阅专栏

尺有所短,寸有所长;不忘初心,方得始终

请关注公众号:星河之码

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

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

一、单表最大到底能存多少数据

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

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

  • 主键类型为Int时

    主键32位,数据最大为2^32-1,大约可以存储21亿的数据,远远大约2KW。

  • 主键类型为bigint时

    主键64位,数据最大为2^64-1,存储的数据远远大于了常用的计量单位了,磁盘都达不到这个数量级。

  • 主键类型为tinyint时

    主键8位,数据最大为255,Id自增超过255就会报错

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

二、数据存储的结构

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

2.1 数据存储的结构

在MySQL中默认的存储引擎是InnoDB,在之前的 《存储引擎》中有说过,InnoDB为每个表都生成了两个文件:

  • .frm文件:表结构文件
  • .ibd文件:数据文件(聚簇索引包含数据与索引),又叫表空间

我们表中的的数据其实都是存储在磁盘的.ibd文件中,而每次读取整个.ibd文件无疑是非常慢的,所以在 《InnoDB数据文件》中又提到,InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16KB。如下

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

  • 页的组成

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

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

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

  • 记录被分散在不同的数据页中,InnoDB通过页号【表空间的地址偏移量】来标识数据具体在哪一页中
  • 不通的数据页之间使用前后指针进行关联,避免检索消耗,
  • 当找到数据在那个数据页之后,InnoDB为避免遍历检索而提供了一个页目录,页目录通过二分查找将查找效率从O(n) 变成O(lgn),从而快速定位数据的位置。

2.2 索引的结构

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

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

  • 全表扫描:简单粗暴,没那么多花花肠子,干就完事,但是数据量大了,性能就会下降,非长久之计
  • 通过索引找到数据页:重点了解一下这个

在 《索引基本原理》中解释了InnoDB索引是基于B+tree实现的,InnoDB在构建B+tree结构时,一般会找出每个数据页中id最小(或者说索引最小, InnoDB主键即聚簇索引)的记录与其对应的页号,将id与页号组成一个新的记录,存储在一个新生成的数据页中,其大小也为16K,为与存储数据的数据页区分,引入了数据页之间的上下层级关系,也就是页层级(page level)。因此我们知道在B+tree中分为两部分:

  • 叶子节点:真正存放表中的数据的数据页,page level = 0
  • 非叶子节点:存放索引以及索引对应数据所在的页号的数据页

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

三、B+Tree能存储多少数据

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

如上图:

  • 将B+tree的高度定义为N
  • 非叶子节点的数据页存储数量为X,也就是有X个数据页的页号
  • 叶子节点的数据页存储数据为Y

根据以上定义,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的数据量

  • 两层B+tree的数据量(N=2)

    M = {X ^ (N-1)} * Y = {1280 ^ (2-1)} * 15 = 19200 条

  • 三层B+tree的数据量(N=3)

    M = {X ^ (N-1)} * Y = {1280 ^ (3-1)} * 15 = 24579000条

  • 四层B+tree的数据量(N=4)

    M = {X ^ (N-1)} * Y = {1280 ^ (4-1)} * 15 = 计算器都算不清楚了

    可能还没有写到这么多数据,磁盘已经罢工了

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

四、啥时候能超过2000W的数据

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

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

  • 叶子节点数据页的数据量

    Y = 15 * 1024 / 100 = 153

  • 三层B+tree的数据量

    M = {X ^ (N-1)} * Y = {1280 ^ (3-1)} * 153 = 250675200条

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

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

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

  • 总结

    这里总结一下前文中提的问题其他影响行数的因素?现在就很清晰了,除了主键大小和磁盘限制,最重要的就是索引的结构,即B+tree。

MySQL】阿里:MySQL 单表数据最大不要超过多少?为什么?
九师兄
07-09 2366
B+树叶子和非叶子结点的数据页都是16k,且数据结构一致,区别在于叶子节点放的是真实的数据,而非叶子结点放的是主键和下一个页的地址。B+树一般有两到三层,由于其高扇出,三层就能支持2kw以上的数据,且一次查询最多1~3次磁盘IO,性能也还。存储同样级的数据,B树比B+树层级更高,因此磁盘IO也更多,所以B+树更适合成为mysql索引。索引结构不会影响单表最大数,2kw也只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。单表最大值还受主键大小和磁盘大小限制。
从全备中恢复单库或单表,小心有坑!
kunjian的博客
09-22 262
前言: MySQL 逻辑备份工具最常用的就是 mysqldump 了,一般我们都是备份整个实例或部分业务库。不清楚你有没有做过恢复,恢复场景可能就比较多了,比如我想恢复某个库或某个表等。那么如何从全备中恢复单库或单表,这其中又有哪些隐藏的坑呢?这篇文章我们一起来看下。 1.如何恢复单库或单表 前面文章有介绍过 MySQL 的备份与恢复。可能我们每个数据库实例中都不止一个库,一般备份都是备份整个实例,但恢复需求又是多种多样的,比如说我想只恢复某个库或某张表,这个时候应该怎么操作呢? 如果你的实例数据不大,可
2000万的数还是 MySQL 表的限制吗?
最新发布
m0_38048955的博客
09-10 611
2000万的数还是 MySQL 表的限制吗?
MySQL能支持多大的数据
Truong的专栏
06-10 2万+
MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据,甚至对它产生误解。MySQL单表的上限,主要与操作系统支持的最大文件大小有关。具体数据可以在这里找到:http://dev.mysql.com/doc/refman/5.1/zh/introduction.html#table-size。事实上MySQL能承受的数据的多少主要和数据表的结构有关,并不
MySQL一张表最多能存多少数据
热门推荐
promote的博客
03-28 2万+
MySQL一张表中可以存放多少数据? 一个简单的测试 private static void insertDataDemo() { DButil dButil = new DButil(); myCon = dButil.getConnection(); try { int i = 0; while(1==1) { i++; String sql = "in...
MySQL 单表可以放多少数据,最多 2000 万?
java_2017_csdn的博客
01-17 1151
title、description 分别为 varchar(50)、varchar(250),这两个应该都不会产生溢出页(不太确定),字符编码均为 utf8mb4,实际生产中 70% 以上都是存的中文( 3 字节),25% 为英文(1 字节),还有 5% 为 4 字节的表情,则存满的情况下将占用 (50+250)×(0.7×3+0.25×1+0.05×4) =说明:以上的数据计算,仅供参考,因为有的文章说,在主键为 bigint 的情况下,可存放 160 万叶子节点,整整多出 65 万。
为什么大家说mysql数据库单表最大两千万?依据是啥?
ilini的博客
04-05 5860
故事从好多年前说起。想必大家也听说过数据库单表建议最大2kw条数据这个说法。如果超过了,性能就会下降得比较厉害。巧了。我也听说过。但我不接受它的建议,硬是单表装了1亿条数据。这时候,我们组里新来的实习生看到了之后,天真无邪的问我:"单表不是建议最大两千万吗?为什么这个表都放了1个亿还不分库分表"?我能说我是因为懒吗?我当初设计时哪里想到这表竟然能涨这么快。。。我不能。说了等于承认自己是开发组里的毒瘤,虽然我确实是,但我不能承认。我如坐针毡,如芒刺背,如鲠在喉。开始了一波骚操作。"我这么做是有道理的""虽然这
MySQL单表最大限制
bangpao4432的博客
04-06 284
  想把一个项目的数据库导出来,然后倒入到自己熟悉的MySQL数据库中进和调试。导出来后,发现sql文件整整有12G多大,忽然想起来,MySQL好像有个叫做容限制的神奇特性,但是忘了上限是多少了,所以查阅资料得出了如下结果:   在老版本的 MySQL 3.22 中,MySQL单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但是,当出现MyISAM存储引擎...
MySQL 单表数据最大不要超过多少?为什么?
旅人的博客
06-13 625
所以,在保持相同的层级(相似查询性能)的情况下,在数据大小不同的情况下,其实这个最大建议值也是不同的,而且影响查询性能的还有很多其他因素,比如,数据库版本,服务器配置,sql 的编写等等,MySQL 为了提高性能,会将表的索引装载到内存中。这个过程的图示如下。在 mysql 中索引的数据结构和刚刚描述的页几乎是一模一样的,而且大小也是 16K, 但是在索引页中记录的是页 (数据页,索引页) 的最小主键 id 和页号,以及在索引页中增加了层级的信息,从 0 开始往上算,所以页与页之间就有了上下层级的概念。
45-MySQL单表2000万数据查询慢解决方案1
08-08
MySQL单表2000万数据查询慢解决方案1 本文主要讨论了如何解决MySQL单表2000万数据查询慢的问题,通过将表分区和使用时间触发器来实现数据的优化。 分区设计 在解决方案中,我们使用的是按照8周将单表分为8个区,...
MySQL单表不能超过2000万
java专栏
04-06 324
存储引擎:例如,InnoDB和MyISAM有不同的存储和性能特性。配置:MySQL的配置,如innodb_file_per_table、innodb_log_file_size等,都会影响表的大小和性能。总之,虽然MySQL没有固定的数限制,但管理大表确实需要一些策略和技巧来确保最佳的性能和可扩展性。硬件:服务器的RAM、CPU和存储速度都会影响MySQL处理大数据的能力。查询优化:高效的索引、查询优化和分区策略可以显著提高大表的性能。使用更高效的存储引擎:根据应用程序的需求选择合适的存储引擎。
mysql 10w级别的mysql数据插入
09-11
特别是在“mysql 10w级别的mysql数据插入”这种场景下,一次性插入数十万条记录,如果处理不当,将会耗费大的时间和系统资源。从描述中可以看到,一开始采用单条插入的方式,效率极低,半小时只能插入2w条数据,而...
mysql 2000万_MySQL单表2000万数据查询慢,时间触发器+分区解决
weixin_35288487的博客
01-19 1610
MySQL事起当时我们一个项目,要不停地从第三方系统拿一些监控数据存起来,只保留2个月。数据2千万+。这个数据,查起来就比较慢了,我们就开始优化。思路就是将表分区,我们是按照8周,将单表分了8个区,每周一都会将最早一周的分区Drop掉,然后新建下一周的分区。定时任务这一块,我们当时也没想着用Quartz,直接用MySQL的时间触发器。准备为写本文档,我是在本机用5.7版本,中间会报一些错误,解...
mysql怎么插入10w测试数据_面试题:如何造10w条测试数据,在数据库插入10w条不同数据...
weixin_35843523的博客
02-08 1334
前言面试题:如果造10w条测试数据,如何在数据库插入10w条数据数据不重复最近面试经常会问到sql相关的问题,在数据库中造测试数据是平常工作中经常会用到的场景,一般做压力测试,性能测试也需在数据库中先准备测试数据。那么如何批生成大的测试数据呢?由于平常用python较多,所以想到用python先生成sql,再执sql往数据库插入数据。使用语言:python 3.6插入数据首先我要插入的 S...
Mysql单表最大记录是多少
自救 唯有自强
06-18 4578
mysql单表最大记录数不能超过多少?
mysql查询每个表的数据_Mysql 单表适合的最大数据是多少?如何优化其性能?...
weixin_39728909的博客
11-23 1684
我们说 Mysql 单表适合存储的最大数据,自然不是说能够存储的最大数据,如果是说能够存储的最大,那么,如果你使用自增 ID,最大就可以存储 2^32 或 2^64 条记录了,这是按自增 ID 的数据类型 int 或 bigint 来计算的;如果你不使用自增 id,且没有 id 最大值的限制,如使用足够长度的随机字符串,那么能够限制单表最大数据的就只剩磁盘空间了。显然我们不是在讨论这个问题...
mysql单表最大数据_你的Mysql库真需要Adaptive Hash Index
weixin_39638603的博客
12-03 432
说起AHI(Adaptive Hash Index),有的同学估计很陌生,都没听说,没关系,下面我会详细解释说明的,AHI是什么,mysql库为什么要设计AHI,解决什么问题,只有了解这些原理之后,才能判断,你的业务库是否需要AHI。在说AHI之前,先给大家提一下B+tree索引层数的问题,我们都是知道,随着MySQL数据库单表数据越来越多(在这里留一个问题,多少数据,才会导致B+tree层数...
mysql单表存储数据有上限吗
dxyzhbb的博客
06-01 9487
mysql中, 每个数据库最多可创建20亿个表, 一个表允许定义1024列, 每最大长度为8092字节(不包括文本和图像类型的长度)。 当表中定义有varchar、nvarchar或varbinary类型列时,如果向表中插入的数据超过8092字节时将导致Transact-SQL语句失败,并产生错误信息。 SQL Server对每个表中的数没有直接限制,但它受数据库存储空间的限制。 每个数据库最大空间1048516TB,所以一个表可用的最大空间为1048516TB减去数据库类系属统表
为什么说MySQL单表数不要超过2000w ?
07-16
MySQL单表数不要超过2000w(2000万)的说法是基于性能和可维护性的考虑。以下是一些原因: 1. 查询性能:当表中的数过多时,查询操作可能会变得缓慢。MySQL需要扫描更多的数据来满足查询条件,增加了查询的时间复杂度。特别是在没有适当的索引支持的情况下,查询可能会变得非常耗时。 2. 内存消耗:MySQL在执查询时需要将数据加载到内存中进处理。当表的数过多时,会占用更多的内存资源。如果内存不足,MySQL可能需要频繁地进磁盘读写操作,导致性能下降。 3. 索引维护:随着表中数的增加,索引的维护成本也会增加。当插入、更新或删除数据时,MySQL需要更新相应的索引。当表的数非常大时,索引维护可能变得很慢,影响数据库的整体性能。 4. 数据备份和恢复:当表的数非常大时,备份和恢复数据的时间也会增加。如果需要频繁地进数据备份和恢复操作,这会对系统的可用性和维护性造成影响。 因此,为了保持良好的查询性能和可维护性,一般建议将MySQL单表数控制在2000万以下。当数据超过这个范围时,可以考虑进分表或者其他的数据分片技术来分散数据并提高数据库的性能。
写文章

热门文章

  • 在VMware中安装CentOS7(超详细的图文教程) 24499
  • MySQL(九):MVCC能否解决幻读问题 12482
  • MySQL十四:单表最大2000W行数据 10234
  • MySQL十七:Change Buffer 3205
  • MySQL十九:分库分表实践 2828

分类专栏

  • jvm 2篇
  • docker 2篇
  • 容器 3篇
  • 人工智能
  • mysql 18篇
  • 数据库 23篇
  • 并发编程 7篇
  • 分布式集群解决方案 3篇
  • Kafka 1篇
  • 消息中间件 1篇
  • Redis 3篇
  • 前端 1篇
  • 开发工具 1篇
  • Java 25篇

最新评论

  • MySQL(八):读懂MVCC多版本并发控制

    DeineAdrenalin: 引用「有主键或唯一非空字段」 图里的是DB_ROW_ID才对表情包

  • MySQL十七:Change Buffer

    Pinkkkk: 看用户修改数据的那个流程图,如果数据页没有在buffer pool中,那她怎么知道我修改的这条数据存不存在,然后mysql怎么返回我影响的行数呢

  • 在VMware中安装CentOS7(超详细的图文教程)

    2301_80375375: 进入insert编辑模式后,出现了W10:Warning:Changing a readonly file,该怎么解决呢

  • MySQL(九):MVCC能否解决幻读问题

    Heaven-Ocean: 不可重复读隔离级别下,每个事务只能获取一次read view

  • MySQL十九:分库分表实践

    LogicDreamer: 实践在哪里?

最新文章

  • JVM 的分代模型
  • Jvm 的内存模型
  • Dockerfile
2023年5篇
2022年31篇
2021年4篇
2020年4篇
2019年5篇
2018年1篇

目录

目录

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司网站主机的选择与优化邢台网站优化发布沈阳seo网站排名优化软件潜江低成本网站优化公司自然优化网站有什么好处张掖网站优化推广公司有哪些小网站如何优化青岛企业网站优化网站优化指哪些嘉定区官网网站优化价格费用优化网站100个方法福田公司的网站优化方案郑州网站优化制作魏都区网站优化项目介绍蚌埠网络推广网站优化排名娄底网站建设推广优化茂名网站建设优化seo手机网站优化全年费用网站seo优化和竞价莱山区上市公司网站优化公司网站优化怎么让排名靠前江阳网站优化域名优化对网站优化有什么意义铁岭网站关键词排名优化网站排名优化培训如何优化网站里择火星赞广州优化网站关键词牡丹江英文网站seo优化沧州企业网站排名优化北京电子网站优化价格表香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化