大厂处理 MySQL 大数据表的 3 种选择方案!
场景当我们业务数据库表中的数据越来越多如果你也和我遇到了以下类似场景那让我们一起来解决这个问题数据的插入,查询时长较长后续业务需求的扩展 在表中新增字段 影响较大表中的数据并不是所有的都为有效数据 需求只查询时间区间内的评估表数据体量我们可以从表容量/磁盘空间/实例容量三方面评估数据体量接下来让我们分别展开来看看表容量表容量主要从表的记录数、平均长度、增长量、读写量、总大小量进行评估。一般对于OLTP的表建议单表不要超过2000W行数据量总大小15G以内。访问量单表读写量在1600/s以内查询行数据的方式我们一般查询表数据有多少数据时用到的经典sql语句如下select count(*) from table select count(1) from table但是当数据量过大的时候这样的查询就可能会超时所以我们要换一种查询方式use 库名 show table status like 表名 ; 或show table status like 表名\G ;上述方法不仅可以查询表的数据还可以输出表的详细信息 , 加\G可以格式化输出。包括表名 存储引擎 版本 行数 每行的字节数等等大家可以自行试一下哈磁盘空间查看指定数据库容量大小select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量(MB), truncate(index_length/1024/1024, 2) as 索引容量(MB) from information_schema.tables order by data_length desc, index_length desc;查询单个库中所有表磁盘占用大小select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量(MB), truncate(index_length/1024/1024, 2) as 索引容量(MB) from information_schema.tables where table_schemamysql order by data_length desc, index_length desc;查询出的结果如下图片建议数据量占磁盘使用率的70%以内。同时对于一些数据增长较快可以考虑使用大的慢盘进行数据归档归档可以参考方案三实例容量MySQL是基于线程的服务模型因此在一些并发较高的场景下单实例并不能充分利用服务器的CPU资源吞吐量反而会卡在mysql层可以根据业务考虑自己的实例模式出现问题的原因上面我们已经查到我们数据表的体量了 那么为什么单表数据量越大 业务的执行效率就越慢 根本原因是什么呢一个表的数据量达到好几千万或者上亿时加索引的效果没那么明显啦。性能之所以会变差是因为维护索引的B树结构层级变得更高了查询一条数据时需要经历的磁盘IO变多因此查询性能变慢。❝大家是否还记得一个B树大概可以存放多少数据量呢❞InnoDB存储引擎最小储存单元是页一页大小就是16k。B树叶子存的是数据内部节点存的是键值指针。索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中进而再去数据页中找到需要的数据图片假设B树的高度为2的话即有一个根结点和若干个叶子结点。这棵B树的存放总记录数为根结点指针数*单个叶子节点记录行数。如果一行记录的数据大小为1k那么单个叶子节点可以存的记录数 16k/1k 16.非叶子节点内存放多少指针呢我们假设主键ID为bigint类型长度为8字节(面试官问你int类型一个int就是32位4字节)而指针大小在InnoDB源码中设置为6字节所以就是8614字节16k/14B 16*1024B/14B 1170因此一棵高度为2的B树能存放1170 * 1618720条这样的数据记录。同理一棵高度为3的B树能存放1170 *1170 *16 21902400也就是说可以存放两千万左右的记录。B树高度一般为1-3层已经满足千万级别的数据存储。如果B树想存储更多的数据那树结构层级就会更高查询一条数据时需要经历的磁盘IO变多因此查询性能变慢。如何解决单表数据量太大查询变慢的问题知道了根本原因之后我们就需要考虑如何优化数据库来解决问题了这里提供了三种解决方案包括数据表分区分库分表冷热数据归档 了解完这些方案之后大家可以选取适合自己业务的方案方案一数据表分区我们首先看一下分区有什么优缺点表分区有什么好处与单个磁盘或文件系统分区相比可以存储更多的数据。对于那些已经失去保存意义的数据通常可以通过删除与那些数据有关的分区很容易地删除那些数据。相反地在某些情况下添加新数据的过程又可以通过为那些新数据专门增加一个新的分区来很方便地实现。一些查询可以得到极大的优化这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改所以在第一次配置分区方案时还不曾这么做时可以重新组织数据来提高那些常用查询的效率。涉及到例如SUM()和COUNT()这样聚合函数的查询可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id”。通过“并行”这意味着该查询可以在每个分区上同时进行最终结果只需通过总计所有分区得到的结果。通过跨多个磁盘来分散数据查询来获得更大的查询吞吐量。表分区的限制因素一个表最多只能有1024个分区。MySQL5.1中分区表达式必须是整数或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。如果分区字段中有主键或者唯一索引的列那么多有主键列和唯一索引列都必须包含进来。即分区字段要么不包含主键或者索引列要么包含全部主键和索引列。分区表中无法使用外键约束。MySQL的分区适用于一个表的所有数据和索引不能只对表数据分区而不对索引分区也不能只对索引分区而不对表分区也不能只对表的一部分数据分区。在进行分区之前可以用如下方法 看下数据库表是否支持分区哈mysql show variables like %partition%; -------------------------- | Variable_name | Value | -------------------------- | have_partitioning | YES | -------------------------- 1 row in set (0.00 sec)方案二数据库分表为什么要分表分表后显而易见单表数据量降低树的高度变低查询经历的磁盘io变少则可以提高效率 mysql 分表分为两种 水平分表和垂直分表分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题将原来独立的数据库拆分成若干数据库组成 将数据大表拆分成若干数据表组成使得单一数据库、单一数据表的数据量变小从而达到提升数据库性能的目的。水平分表定义数据表行的拆分通俗点就是把数据按照某些规则拆分成多张表或者多个库来存放。分为库内分表和分库。比如一个表有4000万数据查询很慢可以分到四个表每个表有1000万数据图片垂直分表定义列的拆分根据表之间的相关性进行拆分。常见的就是一个表把不常用的字段和常用的字段就行拆分然后利用主键关联。或者一个数据库里面有订单表和用户表数据量都很大进行垂直拆分用户库存用户表的数据订单库存订单表的数据图片缺点垂直分隔的缺点比较明显数据不在一张表中会增加join 或 union之类的操作知道了两个知识后我们来看一下分库分表的方案1.取模方案拆分之前先预估一下数据量。比如用户表有4000w数据现在要把这些数据分到4个表user1 user2 uesr3 user4。比如id 1717对4取模为1加上 所以这条数据存到user2表。❝注意进行水平拆分后的表要去掉auto_increment自增长。这时候的id可以用一个id 自增长临时表获得或者使用redis incr的方法。❞图片优点数据均匀的分到各个表中出现热点问题的概率很低。缺点以后的数据扩容迁移比较困难难当数据量变大之后以前分到4个表现在要分到8个表取模的值就变了需要重新进行数据迁移。2.range 范围方案以范围进行拆分数据就是在某个范围内的订单存放到某个表中。比如id12存放到user1表id1300万的存放到user2 表。图片优点有利于将来对数据的扩容缺点如果热点数据都存在一个表中则压力都在一个表中其他表没有压力。❝我们看到以上两种方案 都存在缺点 但是却又是互补的那么我们将这两个方案结合会怎样呢❞3.hash取模和range方案结合如下图 我们可以看到 group 组存放id 为0~4000万的数据然后有三个数据库 DB0 DB1 DB2DB0里面有四个数据库DB1 和DB2 有三个数据库假如id为15000 然后对10取模为啥对10 取模 因为有10个表取0 然后 落在DB_0,然后在根据range 范围落在Table_0里面。总结采用hash取模和range方案结合 既可以避免热点数据的问题也有利于将来对数据的扩容我们已经了解了 mysql分区和分表的知识 那我们看一下这两个技术有何不同以及适用场景分区分表的区别1、实现方式上mysql的分表是真正的分表一张表分成很多表后每一个小表都是完整的一张表都对应三个文件一个.MYD数据文件.MYI索引文件.frm表结构分区不一样一张大表进行分区后他还是一张表不会变成二张表但是他存放数据的区块变多了。2、提高性能上分表重点是存取数据时如何提高mysql并发能力上而分区呢如何突破磁盘的读写能力从而达到提高mysql性能的目的。3、实现的难易度上1、分表的方法有很多用merge来分表是最简单的一种方式。这种方式根分区难易度差不多并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。2、分区实现是比较简单的建立分区表根建平常的表没什么区别并且对开代码端来说是透明的分区分表的联系1、都能提高mysql的性高在高并发状态下都有一个良好的表现。2、分表和分区不矛盾可以相互配合的对于那些大访问量并且表数据比较多的表我们可以采取分表和分区结合的方式访问量不大但是表数据很多的表我们可以采取分区的方式等。分库分表存在的问题1、事务问题在执行分库分表之后由于数据存储到了不同的库上数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务将付出高昂的性能代价如果由应用程序去协助控制形成程序逻辑上的事务又会造成编程方面的负担。2、跨库跨表的join问题在执行了分库分表之后难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上这时表的关联操作将受到限制我们无法join位于不同分库的表也无法join分表粒度不同的表结果原本一次查询能够完成的业务可能需要多次查询才能完成。3、额外的数据管理负担和数据运算压力额外的数据管理负担最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题这些都可以通过应用程序解决但必然引起额外的逻辑运算。例如对于一个记录用户成绩的用户数据表userTable业务要求查出成绩最好的100位在进行分表之前只需一个order by语句就可以搞定但是在进行分表之后将需要n个order by语句分别查出每一个分表的前100名用户数据然后再对这些数据进行合并计算才能得出结果。方案三冷热归档为什么要冷热归档其实原因和方案二类似都是降低单表数据量树的高度变低查询经历的磁盘io变少则可以提高效率 如果大家的业务数据有明显的冷热区分比如只需要展示近一周或一个月的数据。那么这种情况这一周喝一个月的数据我们称之为热数据其余数据为冷数据。那么我们可以将冷数据归档在其他的库表中提高我们热数据的操作效率。接下来讲一下归档的过程创建归档表 创建的归档表 原则上要与原表保持一致归档表数据的初始化图片业务增量数据处理过程图片数据的获取过程图片以上三种方案我们如何选型

相关新闻

泛型 + 函数式编程,让你的代码看着高级多了!

泛型 + 函数式编程,让你的代码看着高级多了!

今天就带大家一步一步地感受,泛型和函数式编程的优雅所在!📒案例分析2.1 结构化的代码以分页为例子,来感受一下什么是结构化的代码。特别说明一下:分页还需当前页数、页大小,以及校验等,本案例忽…

2026/9/23 6:34:54 阅读更多 →
JavaScript正则表达式实战:从基础到高级应用

JavaScript正则表达式实战:从基础到高级应用

1. 正则表达式在JavaScript中的基础定位正则表达式(Regular Expression)作为文本处理的瑞士军刀,在JavaScript中扮演着至关重要的角色。我至今记得第一次用正则表达式处理用户输入时的震撼——原本需要几十行代码才能完成的表单验证&#xff…

2026/9/25 10:34:28 阅读更多 →
HTML作业实战:从零基础到完整网页开发指南

HTML作业实战:从零基础到完整网页开发指南

1. HTML作业展示:从零基础到完整网页的实战指南 作为一名前端开发工程师,我见过太多初学者在完成HTML作业时的困惑和挫折。HTML作为网页开发的基石语言,看似简单却暗藏玄机。今天我将分享一套完整的HTML作业制作流程,涵盖从环境搭…

2026/9/24 1:43:50 阅读更多 →

最新新闻

企业微信 JSSDK 进阶实战:用 Senparc.Weixin 完成 wx.agentConfig 双签名与审批流唤起

企业微信 JSSDK 进阶实战:用 Senparc.Weixin 完成 wx.agentConfig 双签名与审批流唤起

后端即时通讯金融科技 【免费下载链接】WeiXinMPSDK 微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 …

2026/9/25 15:57:47 阅读更多 →
BAML 多语言 SDK 生成体系:从 baml generate 命令到 sdk_tests 验证矩阵

BAML 多语言 SDK 生成体系:从 baml generate 命令到 sdk_tests 验证矩阵

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 本文以 BAML SDK 总览文档 为核心,讲解 BAML(The programming langua…

2026/9/25 15:57:47 阅读更多 →
eslint-plugin-react 规则详解:react/no-this-in-sfc —— 禁止无状态函数组件中使用 `this`

eslint-plugin-react 规则详解:react/no-this-in-sfc —— 禁止无状态函数组件中使用 `this`

开发工具代码质量静态分析 【免费下载链接】eslint-plugin-react React-specific linting rules for ESLint 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-react 点击查看 免费下载 react/no-this-in-sfc 是 eslint-plugin-react 提供的一条"可…

2026/9/25 15:57:47 阅读更多 →
开源大模型本地部署与安全实战:Qwen微调、微软工具链与谷歌生态

开源大模型本地部署与安全实战:Qwen微调、微软工具链与谷歌生态

1. 开源AI浪潮下的技术选型与安全博弈过去一年里,我身边做开发和运维的朋友聊得最多的话题,从“你用了哪个API”逐渐变成了“你本地跑了哪个模型”。这个转变背后其实是一个很明显的信号:开源大模型的能力已经跨过了“能用”的门槛&#xff0…

2026/9/25 15:57:47 阅读更多 →
开源AI代码评审工具open-code-review:架构、部署与实战

开源AI代码评审工具open-code-review:架构、部署与实战

做代码评审这件事,我一开始是有点抗拒AI介入的。原因很简单:一个不懂业务上下文、没见过团队历史的模型,凭什么对一个改了三行代码的PR指手画脚?后来我被现实教育了——团队规模变大之后,人工评审根本忙不过来&#xf…

2026/9/25 15:57:46 阅读更多 →
Atlas 300V实战:基于昇腾AI加速卡的YOLO推理部署全攻略

Atlas 300V实战:基于昇腾AI加速卡的YOLO推理部署全攻略

1. Atlas 300V到底是什么先说结论:Atlas 300V Pro(也就是大家常说的Atlas 300V 24G)确实是一块运算加速卡,但它不是普通意义上的“显卡”。它是一块专门为AI推理设计的加速卡,主要任务是把已经训练好的深度学习模型&am…

2026/9/25 15:56:46 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →