MySQL最大建议行数2000W-老司机做了个实验…… (mysql最新版本)

教程大全 2025-07-20 17:55:51 浏览

一、背景

作为在后端圈开车的多年老司机,是不是经常听到过,“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”,“你这个表数据都马上要到 2000w 了,难怪查询速度慢”。

这些名言民语就和“群里只讨论技术,不开车,开车速度不要超过 120 码,否则自动踢群”,只听过,没试过,哈哈。

下面我们就把车速踩到底,干到 180 码试试…….

二、实验

实验一把看看……建一张表:

插入一条数据:

利用 mysql 伪列 rownum 设置伪列起始点为 1

运行下面的 sql,连续执行 20 次,就是 2 的 20 次方约等于 100w 的数据;执行 23 次就是 2 的 23 次方约等于 800w , 如此下去即可实现千万测试数据的插入,如果不想翻倍翻倍的增加数据,而是想少量,少量的增加,有个技巧,就是在 SQL 的后面增加 where 条件,如 id > 某一个值去控制增加的数据量即可。

此处需要注意的是,也许你在执行到近 800w 或者 1000w 数据的时候,会报错:The total number of locks exceeds the lock table size,这是由于你的临时表内存设置的不够大,只需要扩大一下设置参数即可。

先来看一组测试数据,这组数据是在 mysql 8.0 的版本,并且是在我本机上,由于本机还跑着 idea , 浏览器等各种工具,所以并不是机器配置就是用于数据库配置,所以测试数据只限于参考。

看到这组数据似乎好像真的和标题对应,当数据达到 2000w 以后,查询时长急剧上升;难道这就是铁律吗?

那下面我们就来看看这个建议值 2kw 是怎么来的?

三、单表数量限制

首先我们先想想数据库单表行数最大多大?

看看上面的建表 sql,id 是主键,本身就是唯一的,也就是说主键的大小可以限制表的上限,如果主键声明 int 大小,也就是 32 位,那么支持 2^32-1 ~~ 21 亿;如果是 bigint,那就是 2^62-1 ?(36893488147419103232),难以想象这个的多大了,一般还没有到这个限制之前,可能数据库已经爆满了!!

有人统计过,如果建表的时候,自增字段选择无符号的 bigint , 那么自增长最大值是 18446744073709551615,按照一秒新增一条记录的速度,大约什么时候能用完?

四、表空间

下面我们再来看看索引的结构,对了,我们下面讲内容都是基于 Innodb 引擎的,大家都知道 Innodb 的索引内部用的是 B+ 树

mysql最新版本

这张表数据,在硬盘上存储也是类似如此的,它实际是放在一个叫 person.ibd (innodb>

五、页的数据结构

因为每个页只有 16K 的大小,但是如果数据很多,那一页肯定就放不下这些数据,那数据肯定就会被分到其他的页中,所以为了把这些页关联起来,肯定就会有记录前后页地址,方便找到对应页;同时每页都是唯一的,那就会需要有一个唯一标志来标记页,就是页号;页中会记录数据所以会存在读写操作,读写操作会存在中断或者其他异常导致数据不全等,那就会需要有校验机制,所以里面还有会校验码,而读操作最重要的就是效率问题,如果按照记录一个个进行遍历,那肯定是很费劲的,所以这里面还会为数据生成对应的页目录(Page Directory); 所以实际页的内部结构像是下面这样的。

从图中可以看出,一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分,有的部分占用的字节数是确定的,有的部分占用的字节数是不确定的。

在页的 7 个组成部分中,我们自己存储的记录会按照我们指定的行格式存储到 User Records 部分。

但是在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到 User Records 部分,当 Free Space 部分的空间全部被 User Records 部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了。这个过程的图示如下。

刚刚上面说到了数据的新增的过程。

那下面就来说说,数据的查找过程,假如我们需要查找一条记录,我们可以把表空间中的每一页都加载到内存中,然后对记录挨个判断是不是我们想要的,在数据量小的时候,没啥问题,内存也可以撑;但是现实就是这么残酷,不会给你这个局面;为了解决这问题,mysql 中就有了索引的概念;大家都知道索引能够加快数据的查询,那到底是怎么个回事呢?下面我就来看看。

六、索引的数据结构

在 mysql 中索引的数据结构和刚刚描述的页几乎是一模一样的,而且大小也是 16K, 但是在索引页中记录的是页 (数据页,索引页) 的最小主键 id 和页号,以及在索引页中增加了层级的信息,从 0 开始往上算,所以页与页之间就有了上下层级的概念。

看到这个图之后,是不是有点似曾相似的感觉,是不是像一棵二叉树啊,对,没错!它就是一棵树,只不过我们在这里只是简单画了三个节点,2 层结构的而已,如果数据多了,可能就会扩展到 3 层的树,这个就是我们常说的 B+ 树,最下面那一层的 page level =0, 也就是叶子节点,其余都是非叶子节点。

看上图中,我们是单拿一个节点来看,首先它是一个非叶子节点(索引页),在它的内容区中有 id 和 页号地址两部分,这个 id 是对应页中记录的最小记录 id 值,页号地址是指向对应页的指针;而数据页与此几乎大同小异,区别在于数据页记录的是真实的行数据而不是页地址,而且 id 的也是顺序的。

七、单表建议值

下面我们就以 3 层,2 分叉(实际中是 M 分叉)的图例来说明一下查找一个行数据的过程。

比如说我们需要查找一个 id=6 的行数据,因为在非叶子节点中存放的是页号和该页最小的 id,所以我们从顶层开始对比,首先看页号 10 中的目录,有 [id=1, 页号 = 20],[id=5, 页号 = 30], 说明左侧节点最小 id 为 1,右侧节点最小 id 是 5;6>5, 那按照二分法查找的规则,肯定就往右侧节点继续查找,找到页号 30 的节点后,发现这个节点还有子节点(非叶子节点),那就继续比对,同理,6>5&&6<7, 所以找到了页号 60,找到页号 60 之后,发现此节点为叶子节点(数据节点),于是将此页数据加载至内存进行一一对比,结果找到了 id=6 的数据行。

从上述的过程中发现,我们为了查找 id=6 的数据,总共查询了三个页,如果三个页都在磁盘中(未提前加载至内存),那么最多需要经历三次的磁盘 IO。

需要注意的是,图中的页号只是个示例,实际情况下并不是连续的,在磁盘中存储也不一定是顺序的。

至此,我们大概已经了解了表的数据是怎么个结构了,也大概知道查询数据是个怎么的过程了,这样我们也就能大概估算这样的结构能存放多少数据了。

从上面的图解我们知道 B+ 数的叶子节点才是存在数据的,而非叶子节点是用来存放索引数据的。

所以,同样一个 16K 的页,非叶子节点里的每条数据都指向新的页,而新的页有两种可能

假设

如下图中所示

Total =x^(z-1) *y 也就是说总数会等于 x 的 z-1 次方 与 Y 的乘积。

在文章的开头已经介绍了页的结构,索引也也不例外,都会有 FILE Header (38 byte)、Page Header (56 Byte)、Infimum + Supermum(26 byte)、File Trailer(8byte), 再加上页目录,大概 1k 左右,我们就当做它就是 1K, 那整个页的大小是 16K, 剩下 15k 用于存数据,在索引页中主要记录的是主键与页号,主键我们假设是 Bigint (8 byte), 而页号也是固定的(4Byte), 那么索引页中的一条数据也就是 12byte; 所以 x=15*1024/12≈1280 行。

叶子节点和非叶子节点的结构是一样的,同理,能放数据的空间也是 15k;但是叶子节点中存放的是真正的行数据,这个影响的因素就会多很多,比如,字段的类型,字段的数量;每行数据占用空间越大,页中所放的行数量就会越少;这边我们暂时按一条行数据 1k 来算,那一页就能存下 15 条,Y≈15。

算到这边了,是不是心里已经有谱了啊

根据上述的公式,Total =x^(z-1) y,已知 x=1280,y=15

假设 B+ 树是两层,那就是 Z =2, Total = (1280 ^1 )15 = 19200

假设 B+ 树是三层,那就是 Z =3, Total = (1280 ^2) *15 = 24576000 (约 2.45kw)

哎呀,妈呀!这不是正好就是文章开头说的最大行数建议值 2000w 嘛!对的,一般 B+ 数的层级最多也就是 3 层,你试想一下,如果是 4 层,除了查询的时候磁盘 IO 次数会增加,而且这个 Total 值会是多少,大概应该是 3 百多亿吧,也不太合理,所以,3 层应该是比较合理的一个值。

到这里难道就完了?

不,我们刚刚在说 Y 的值时候假设的是 1K ,那比如我实际当行的数据占用空间不是 1K,而是 5K,那么单个数据页最多只能放下 3 条数据。

同样,还是按照 Z=3 的值来计算,那 Total = (1280 ^2) *3 = 4915200 (近 500w)

所以,在保持相同的层级(相似查询性能)的情况下,在行数据大小不同的情况下,其实这个最大建议值也是不同的,而且影响查询性能的还有很多其他因素,比如数据库版本、 服务器 配置、SQL的编写等,MySQL 为了提高性能,会将表的索引装载到内存中。在 InnoDB buffer size 足够的情况下,其能完成全加载进内存,查询不会有问题。但是,当单表数据库到达某个量级的上限时,导致内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降,所以增加硬件配置(比如把内存当磁盘使),可能会带来立竿见影的性能提升哈。

八、总结


家庭需要装几个漏电保护器和空气开关

您好,您的总功率是10个多千瓦,用4平方的线够了,漏电保护器,只给插座这条线上安装,一个就够了,因为空调,热水器,这些都是在插座上使用的,总开关使用40A或63Ad的空开都行,其他的有几条线,安几个小空开,漏电保护器是保护人的,空开是保护设备的,有一个总空开,就没有必要在漏电保护器上另外加空开了,,总开关不可以使用漏电保护器来做,,希望对您有所帮助,那不明白可以在问我

请仔细分析下气功师

气功(俗称国宝级职业,如熊猫一样稀少的选择此职业的玩家,同一个服务器都很少,全身布甲,防御脆皮,主要靠手法和风骚走位,攻击手段靠魔法伤害输出,刷图超爽,在不掉线的情况下,组队必备,后期强大);气功魔法伤害输出高,而且玩这个职业最大的优势就是花钱少,气功穿布甲,布甲白菜价(DNF里布甲最便宜,然后是板甲)

关于气功前30级建议轻甲,如果是新手上来就穿布的更容易死掉(而且40级以前,气功招牌刷图技能不多),熬过40级就可以穿套装或者魔暴散装

为什么穿全全套布甲?因为气功是远程伤害魔法输出职业,招数费蓝,而且技能CD长,所以布甲+释放和回蓝武器选择肯定是手套了,减少魔法用蓝量,而且速度快,魔攻高(气功不靠近身打击,所以物理攻击没大用,远程魔法伤害输出)

感电技能现在不掉线了吧(昨天我们4百花组队刷图,那叫一个乐)

PK+点绝对不适合刷图(气功还是刷图牛叉,个人理解)

至于觉醒技能伤害,这要根据你的装备、武器强度(强化程度)还有最重要的“智力”

练级装备30级天赎粉吧(一直价格就没上去,最贵的时候70W,现在也就30W就可以搞定)其实40级可以换个天旋(+雷霆和背摔的那个,便宜10W最多,一般在5-8W),有钱就闪灵(只有设计图,合成造价150W+,我合过,麻烦死了还没舍得用就50了)然后45换个巨熊(也10W最多)50级苍莽手(气功50级普遍使用的手套,属性最好也就15W,一般5-10W搞定)50粉冥日现在炒的很高,2000W摆摊都(市场价格在1700W-2200W之间)

全套的布甲最适合气功35-40七星套40-45暝响者套45-50寂魂祈日套其中七星的腰带最贵(设计图老区大概120-150W左右,因为有附加的速度属性,成品大至在180-200W左右(无强化状态)然后是暝响者的腰带;肩膀(10W设计图)其他部位都5W货,品级低的3W,最好也就8W首饰方面刷图就学者(45-50W)、法罗湾项链(10-25W)、戒指(8-15W)PK就是墨竹+贤者有条件的3件套泰拉首饰最好

北京1 59小百花,飘过

VCD光驱用什么播放器最好

Kmplayer v2.9.1.1045 build 514 官方简体优化和组件增强版是一套将网路上所有能见得到的解码程式(Codec)全部 收集于一身的影音播放软体;只要安装了它,你不用再另外安装 一大堆转码程式,就能够顺利观赏所有特殊格式的影片了。 除此 之外,KMPlayer还能够播放DVD与VCD、汇入多种格式的外挂字幕 档、使用普及率最高的WinAMP音效外挂与支援超多种影片效果调整选项等,功能非常强大!注意不要把程序放在中文目录下(包括桌面),这样会不显示中文的!KMPlayer The Professional Media Player! 它支持 Winamp 2/5 的输入、常规、DSP、视觉效果、媒体库插件。 无须注册表支持直接调用 Directshow 滤镜!FFdshow 的视觉特效系统~超强的 GUI 界面~安装电视卡后可以直接代替原软件直接收看电视~支持播放 DVD/VCD 以及绝大多数电脑的媒体文件(AVI 支持 Xvid/DivX/3vid/H264 OGG/OGM/MKV 容器/AC3/DTS 解码~Monkey Audio 解码~)强烈推荐!此播放器除了会将自己的配置信息写入注册表外绝对绿色~ 本版本已经带有 Real 和 QT 解码器 Build 514 更新: *增加了对嵌入在 MP4 中的 Vobsub 字幕支持。 *改进了显示多重字幕的功能。 *添加了可同时显示 3 组字幕的功能。 *添加了在字幕浏览器中编辑字幕的功能。 (实验性) *改进了 在最前 功能,现在已经可以在音频模式中使用 总在最前 功能以及在视频模式中的 在播放时在最前。 *改进了在屏幕右上角的 OSD 功能,您现在可以自定义时间格式了。 *添加了在字幕浏览器中显示由 lyric (歌词秀) 嵌入至 MP3/WMA 字幕的功能。 (实验性) 这是韩国高手写的一个全能媒体播放器。 和其它全能播放器一样,只要您的系统内安装有所需要的解码器或者筛选器,这个播放器就可以播放那类文件。 所不同的是,相对于其它大型播放软件,她是那么的小巧,但就是这个小小的播放器,她的功能之多,项目之全,目前可以称得上是“天下无敌”,只要您能想到的功能她几乎都有,甚至您想不到的功能她也有,例如我发现她的“音频与视频同步”和“声道调整”功能是任何播放软件都没有的,而且这两个功能是看各种电影必需的。 该播放器用于看各类电影绝对是首选播放器!而且其支持几乎所有外接筛选器和解码器,甚至支持 Winamp 的一些插件,而且其外观小巧而纤美,支持开发皮肤外观,各种外衣使她犹如一位清纯而不失华贵,待字闺中的小公主。 原来我的系统内曾经安装有 WMP 、Realplayer 及 hero 等播放器。 自从有了她,我计算机就只安装各类解码器,其它播放器统统都“下岗”了。 KMPlayer The Professional Media Player! 它支持 Winamp 2/5 的输入、常规、DSP、视觉效果、媒体库插件。 无须注册表支持直接调用 Directshow 滤镜!FFdshow 的视觉特效系统~超强的 GUI 界面~安装电视卡后可以直接代替原软件直接收看电视~支持播放 DVD/VCD 以及绝大多数电脑的媒体文件(AVI 支持 Xvid/DivX/3vid/H264 OGG/OGM/MKV 容器/AC3/DTS 解码~Monkey Audio 解码~)强烈推荐!此播放器除了会将自己的配置信息写入注册表外绝对绿色~ KMPlayer是一套将网路上所有能见得到的解码程式(Codec)全部 收集于一身的影音播放软体;只要安装了它,你不用再另外安装 一大堆转码程式,就能够顺利观赏所有特殊格式的影片了。 除此 之外,KMPlayer还能够播放DVD与VCD、汇入多种格式的外挂字幕 档、使用普及率最高的WinAMP音效外挂与支援超多种影片效果调整选项等,功能非常强大!Kmplayer 播放器皮肤使用方法:下载皮肤文件后解压释放到Kmplayer播放器的安装文件夹里的SKINS文件夹内,Kmplayer的默认安装路径为:C:\Program Files\Kmplayer\skins;然后在播放器的面板上右键--皮肤(skins)设置皮肤选项,好了。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐