MYSQL单表数据量达到多少时性能会严重下降的问题探讨!

news2024/12/24 20:22:03

不知从什么时候开始,有着MySQL单表数据量超过2000万性能急剧下降的说法。

在中国互联网技术圈流传着这么一个说法:MySQL 单表数据量大于 2000 万行,性能会明显下降。事实上,这个传闻据说最早起源于百度。具体情况大概是这样的,当年的 DBA 测试 MySQL性能时发现,当单表的量在 2000 万行量级的时候,SQL 操作的性能急剧下降,因此,结论由此而来。然后又据说百度的工程师流动到业界的其它公司,随之也带去了这个信息,所以,就在业界流传开这么一个说法。

再后来,阿里巴巴《Java 开发手册》提出单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。对此,有阿里的黄金铁律支撑,所以,很多人设计大数据存储时,多会以此为标准,进行分表操作。

那这个说法到底有没有理论依据的支撑呢,首先这个性能问题可以说有很多因素组成,比如说硬件以及MYSQL本身的参数设置等等。那今天我们可以从MySQL的索引结构来说说这件事。

凡是有一点MYSQL基础的同学,都知道MYSQL采用B+树作为其索引结构。
在这里插入图片描述
一个问题?
InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。

我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。

下面几张图可以帮你理解最小存储单元:

文件系统中一个文件大小只有1个字节,但不得不占磁盘上4KB的空间。
在这里插入图片描述

innodb的所有数据文件(后缀为ibd的文件),他的大小始终都是16384(16k)的整数倍。
在这里插入图片描述

磁盘扇区、文件系统、InnoDB存储引擎都有各自的最小存储单元。
在这里插入图片描述
在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置:

mysql> show variables like 'innodb_page_size';
+------------------+-------+| Variable_name  | Value |+------------------+-------+| innodb_page_size | 16384 |+------------------+-------+1 row in set (0.00 sec)

数据表中的数据都是存储在页中的,所以一个页中能存储多少行数据呢?假设一行数据的大小是1k,那么一个页可以存放16行这样的数据。

如果数据库只按这样的方式存储,那么如何查找数据就成为一个问题,因为我们不知道要查找的数据存在哪个页中,也不可能把所有的页遍历一遍,那样太慢了。所以人们想了一个办法,用B+树的方式组织这些数据。如图所示:
在这里插入图片描述
我们先将数据记录按主键进行排序,分别存放在不同的页中(为了便于理解我们这里一个页中只存放3条记录,实际情况可以存放很多),除了存放数据的页以外,还有存放键值+指针的页,如图中page number=3的页,该页存放键值和指向数据页的指针,这样的页由N个键值+指针组成。当然它也是排好序的。这样的数据组织形式,我们称为索引组织表。现在来看下,要查找一条数据,怎么查?

select * from user where id=5;

这里id是主键,我们通过这棵B+树来查找,首先找到根页,你怎么知道user表的根页在哪呢?其实每张表的根页位置在表空间文件中是固定的,即page number=3的页(这点我们下文还会进一步证明),找到根页后通过二分查找法,定位到id=5的数据应该在指针P5指向的页中,那么进一步去page number=5的页中查找,同样通过二分查询法即可找到id=5的记录:
在这里插入图片描述
现在我们清楚了InnoDB中主键索引B+树是如何组织数据、查询数据的,我们总结一下:

1、InnoDB存储引擎的最小存储单元是页,页可以用于存放数据也可以用于存放键值+指针,在B+树中叶子节点存放数据,非叶子节点存放键值+指针。

2、索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而在去数据页中查找到需要的数据;

那么回到我们开始的问题,通常一棵B+树可以存放多少行数据?

这里我们先假设B+树高为2,即存在一个根节点和若干个叶子节点,那么这棵B+树的存放总记录数为:根节点指针数*单个叶子节点记录行数。

上文我们已经说明单个叶子节点(页)中的记录数=16K/1K=16。(这里假设一行记录的数据大小为1k,实际上现在很多互联网业务数据记录大小通常就是1K左右)。

那么现在我们需要计算出非叶子节点能存放多少指针,其实这也很好算,我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即16384/14=1170。那么可以算出一棵高度为2的B+树,能存放1170*16=18720条这样的数据记录。

根据同样的原理我们可以算出一个高度为3的B+树可以存放:1170117016=21902400条这样的记录。所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。

怎么得到InnoDB主键索引B+树的高度?

上面我们通过推断得出B+树的高度通常是1-3,下面我们从另外一个侧面证明这个结论。在InnoDB的表空间文件中,约定page number为3的代表主键索引的根页,而在根页偏移量为64的地方存放了该B+树的page level。如果page level为1,树高为2,page level为2,则树高为3。即B+树的高度=page level+1;下面我们将从实际环境中尝试找到这个page level。

在实际操作之前,你可以通过InnoDB元数据表确认主键索引根页的page number为3,你也可以从《InnoDB存储引擎》这本书中得到确认。

SELECT b.NAME b_name,a.NAME a_name,index_id,type,a.space,a.PAGE_NO FROM information_schema.INNODB_SYS_INDEXES a,information_schema.INNODB_SYS_TABLES b WHERE a.table_id=b.table_id AND a.space<> 0;

执行结果:
在这里插入图片描述
可以看出数据库dbt3下的customer表、lineitem表主键索引根页的page number均为3,而其他的二级索引page number为4。关于二级索引与主键索引的区别请参考MySQL相关书籍,本文不在此介绍。

下面我们对数据库表空间文件做想相关的解析:

因为主键索引B+树的根页在整个表空间文件中的第3个页开始,所以可以算出它在文件中的偏移量:16384*3=49152(16K=16384为页大小)。

另外根据《InnoDB存储引擎》中描述在根页的64偏移量位置前2个字节,保存了page level的值,因此我们想要的page level的值在整个文件中的偏移量为:16384*3+64=49152+64=49216,前2个字节中。

接下来我们用hexdump工具,查看表空间文件指定偏移量上的数据:
在这里插入图片描述
linetem表的page level为2,B+树高度为page level+1=3;

region表的page level为0,B+树高度为page level+1=1;

customer表的page level为2,B+树高度为page level+1=3;

这三张表的数据量如下:
在这里插入图片描述
总结:
lineitem表的数据行数为600多万,B+树高度为3,customer表数据行数只有15万,B+树高度也为3。可以看出尽管数据量差异较大,这两个表树的高度都是3,换句话说这两个表通过索引查询效率并没有太大差异,因为都只需要做3次IO。那么如果有一张表行数是一千万,那么他的B+树高度依旧是3,查询效率仍然不会相差太大。

region表只有5行数据,当然他的B+树高度为1。

最后来思考一下这个问题:

为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?

答案是:
因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS 魔棒选区工具使用方法

我们现在PS中打开一个项目 然后 如下图 在工具左侧 选择魔棒工具 选择魔棒工具之后 我们的鼠标会变成像一个魔法棒一样的东西 我们拿着魔棒工具 在下图指向位置点一下 就可以看到 它在我们整个图上生成了一些选区 这个工具本身也带有一些色彩识别的功能 就相当于 你点的这…

【MySQL系列】MySQL库的学习及基本操作(增删查改)

「前言」文章内容大致是数据库的基本操作 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 哪里会有人喜欢孤独&#xff0c;不过是不喜欢失望罢了。 ——村上春树《挪威的森林》 目录 一、创建/查看数据库二、删除数据库三、…

Java8 lambda 表达式 forEach 如何提前终止?

首先&#xff0c;让我们看一下Java 8中如何使用forEach()方法。forEach()方法接受一个Consumer接口作为参数&#xff0c;该接口定义了一个accept()方法&#xff0c;该方法接受一个对象并对其执行一些操作。因此&#xff0c;我们可以通过Lambda表达式来实现Consumer接口。下面是…

Camtasia2023中文版电脑屏幕记录和课件制作工具

TechSmith Camtasia是一个非常容易使用的电脑屏幕记录和课件制作工具。Camtasia 2023软件集强大的录屏、视频编辑编辑、视频菜单制作、视频影院和视频播放功能于一体&#xff0c;可以轻松制作各种教学课件、微课堂等。Camtasia 2023支持一键录制和共享高质量截屏视频&#xff0…

Pytorch: 数据读取机制Dataloader与Dataset

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 数据读取机制Dataloader与DatasetDataLoader 与 Datasettorch.utils.data.DataLoader区分Epoch、Iteration、Batchs…

2022年真题 - 18 - 磁盘快照

磁盘快照 题目新增 15 G 的磁盘创建 LVM 卷挂载 LVM 卷写入文本创建快照挂载快照验证配置题目 StorageSrv - 磁盘快照 新增 15G 的磁盘,并将其做成 LVM 卷,VG 名称为 snapvg,LV名称为 snaplv 大小为 5G,挂载至 /snapdata 目录下;写入文本的文件数据至 /snapdata 目录下,…

2.5 DNS 应用 -- 2. DNS记录和消息格式

2.5 DNS 应用 -- 2. DNS记录和消息格式 DNS记录DNS协议与消息如何注册域名&#xff1f; DNS记录 资源记录(RR, resource records)TypeA Name: 主机域名Value: IP地址 TypeNS Name: 域(edu.cn)Value: 该域权威域名解析服务器的主机域名 TypeCNAME Name: 某一真实域名的别名 www.…

2.常见网页布局

2.1常见网页布局 第一种 第二种 第三种&#xff08;最常见的&#xff09; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

苹果自带的分享以及图片保存授权和应用跳转

// NSString *testToShare "分享的标题"; // NSURL *urlToShare [NSURL URLWithString:"http://www.baidu.com"]; // UIImage *imageToShare image; // NSArray *activityItems [te…

【算法】程序员必须掌握的算法?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 一&#xff1a;程序员为什么一定要学会算法 二&#xff1a;常见算法介绍 1、时间复杂度 2、空间复杂度 3. 必会内容&#xff1a; 4.使用场景 5. 算法学习网站&#xff1a; 三&…

《Linux基础命令讲解》学习笔记

Linux简单介绍 Linux不是一个具体的操作系统&#xff0c;而是一类操作系统的总称。 具体版本称为发行版&#xff1a; Red Hat:目前被IBM收购&#xff0c;收费版&#xff0c;目前全球最大的Linux供应商 CentOS: Red Hat推出的免费版 Ubuntu :界面比较友好 Linux系统目录结构…

vue3+element-plus实现日历组件农历显示且带列表数据

calendar.js https://gitee.com/mirrors/calendar-js.git 这个js可以去下载&#xff0c;里面涉及的有点多 要设置日历每周以周一开始&#xff0c;需要在main.js中加入这一行代码 import dayjs/locale/zh-cn; // 设置日历每周从周一开始<template><ELPlusLanguageC…

华秋约定您!7月11-13日慕尼黑上海电子展不见不散~

慕尼黑最新华秋展会攻略来啦 华秋携海量产品与方案 以及丰富的元器件产品线 即将亮相慕尼黑上海电子展 现场干货和福利不断 简直不要太精彩&#xff01; 敲黑板 划重点 华秋展位 时间&#xff1a;2023年7月11日-7月13日 地点&#xff1a;国际会展中心&#xff08;上海&…

IT-OT 安全融合是优化风险管理的关键

最新报告揭示了运营技术检测和响应方面的显着可见性差距。 全球网络安全运营商趋势科技宣布了一项新研究&#xff0c;显示企业安全运营中心 (SOC) 正在将其能力扩展到 OT 领域。 然而&#xff0c;重大的可见性和技能相关的挑战仍然造成障碍。 研究发现&#xff0c;一半的组织…

公共医疗数据库汇总:无需实验,高效论文撰写利器

一、引言 在医学研究领域&#xff0c;获取高质量的数据和文献资源是进行科学论文撰写的关键。随着信息技术的发展&#xff0c;以及公共医疗数据库的不断壮大和完善&#xff0c;研究人员可以轻松地获取大量的医学数据和文献信息&#xff0c;从而提高论文撰写的效率和质量。本文将…

基于Python的K-Means聚类算法的酒店客户价值分析(源码+数据+文档+CSV数据文件)

通过对传统的RFM客户价值研究模型进行分析&#xff0c;创新性的引入L&#xff08;信誉度&#xff09;指标到RFM模型中&#xff0c;形成RFML新型更适合酒店行业的客户价值研究模型。 一、技术介绍 &#xff08;1&#xff09;RFM 模型 RFM模型是提出的一种分析客户关系管理&…

C++旋转卡壳法求最小面积外接矩形

旋转卡壳基本概念介绍&#xff1a;(86条消息) 旋转卡壳详解_大学要有梦想的博客-CSDN博客 OpenCV里面有现成的计算最小面积外接矩形的方法&#xff0c;但是由于我装了好久也没装上opencv&#xff0c;最后还是决定自己实现。 求多边形最小面积外接矩形的基本思路是&#xff1a;…

loader 和 plugin

loader 是文件加载器&#xff0c;能够加载资源文件&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中plugin 赋予了 webpack 各种灵活的功能&#xff0c;例如打包优化、资源管理、环境变量注入等&#xff0c;目的是解决…

数据分析:一文带你了解PowerBI技术

目录 一、PowerBI简介 二、Power BI 的组成部分 三、Power BI 如何匹配角色 四、下载 Power BI Desktop 五、登录到 Power BI 服务 六、Power BI的优势 6.1 发展潜力巨大&#xff0c;前景广阔 6.2 可连接的数据来源多&#xff0c;数据量大 6.3 软件更新频率高 6.4 可为…

飞凌嵌入式邀您共聚2023慕尼黑上海电子展

2023慕尼黑上海电子展&#xff08;electronica China&#xff09;将于7月11日~13日在国家会展中心&#xff08;上海&#xff09;盛大召开。本届展会将展示最新的电子技术与应用&#xff0c;涵盖了半导体、嵌入式系统、电源、电池、测试仪器、智能制造、电子设计自动化等众多领域…