解析 MySQL 数据库容量统计、存储限制与优化技巧
管理 MySQL 数据库时,了解数据库中的数据量和存储占用情况是非常重要的,尤其是在面对大规模数据时。无论是为了优化数据库性能,还是为了进行容量规划,准确地统计数据库的容量可以帮助我们做出更好的决策。mysql的客户端工具是Navicat和heidisql。
本文介绍如何通过 MySQL 自带的 information_schema
表来统计数据库和表的存储容量,并探讨 MySQL 存储能力的限制和优化方法 ,包括:
1. 如何统计所有数据库的容量
2. 如何统计某个数据库下的所有表的容量
3. 如何统计某个表的容量
4. MySQL 存储引擎、文件系统和硬件的限制
5. 如何优化大规模数据存储
6. 行和列的大小限制
7. MySQL 版本的区别
1.为什么需要统计数据库容量?
定期监控数据库的存储使用情况非常重要,原因包括:
- 防止过度使用存储空间:当数据库存储达到硬盘容量的上限时,数据库性能会下降,甚至可能导致崩溃。
- 优化性能:了解数据和索引的大小可以帮助做出优化决策,比如是否需要对表进行分区或归档历史数据。
- 容量规划:通过定期监控数据库容量,可以为未来的硬件升级或存储扩展做出合理的规划。
2.MySQL 中的 `information_schema.tables`
MySQL 提供了一个名为 information_schema.tables
的系统表,它包含了所有数据库的元数据,包括表的记录数、数据大小、索引大小等。可以利用这个表来统计数据库和表的容量。
information_schema.tables
中的关键字段:
table_schema
:表示数据库名称。table_name
:表示表名称。table_rows
:表示表中的记录数量(近似值)。data_length
:表示表数据的存储大小(以字节为单位)。index_length
:表示表索引的存储大小(以字节为单位)。data_length + index_length
:表示表的总存储大小(数据和索引的总和)。
3.容量计算单位介绍
在计算和显示 MySQL 数据库或表的容量时,数据的存储大小通常是以字节为单位存储的。为了容易阅读和理解,通常会将这些字节转换为更常见的单位,如 KB、MB 或 GB。
以下是常见存储单位的换算关系:
- 1 KB (Kilobyte) = 1024 字节
- 1 MB (Megabyte) = 1024 KB = 1024 * 1024字节
- 1 GB (Gigabyte) = 1024 MB = 1024 * 1024 * 1024 字节
本文把数据大小转换为 MB(兆字节)。
4. 统计所有数据库的容量
为了统计每个数据库的容量,我们可以编写一个 SQL 查询,将所有表的 `data_length` 和 `index_length` 汇总,并将结果转换为 MB。以下是一个统计每个数据库的记录数、数据容量、索引容量及总容量的查询示例:SELECT table_schema AS "数据库", SUM(table_rows) AS '记录数',ROUND(SUM(data_length) / 1024 / 1024, 2) AS '数据容量(MB)',ROUND(SUM(index_length) / 1024 / 1024, 2) AS '索引容量(MB)',ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '总容量(MB)'
FROM information_schema.tables
GROUP BY table_schema;
查询结果分析:
- 数据库:每个数据库的名称。
- 记录数:每个数据库中所有表的记录总数(近似值)。
- 数据容量(MB):每个数据库中所有表的数据总大小,单位为 MB。
- 索引容量(MB):每个数据库中所有表的索引总大小,单位为 MB。
- 总容量(MB):每个数据库的总存储容量(数据和索引的总和),单位为 MB。
输出:
数据库 | 记录数 | 数据容量(MB) | 索引容量(MB) | 总容量(MB) |
---|---|---|---|---|
employees | 150,000 | 450.00 | 120.00 | 570.00 |
sales | 3,500,000 | 22,870.00 | 15,340.00 | 38,210.00 |
test_db | 100 | 1.00 | 1.00 | 2.00 |
5. 统计某个数据库下所有表的容量
统计某个指定数据库中所有表的存储容量,通过 WHERE
子句指定数据库名。以下是针对某个数据库(例如 my_database
)的查询:
SELECT table_name AS "表名",table_rows AS "记录数",ROUND(data_length / 1024 / 1024, 2) AS "数据容量(MB)",ROUND(index_length / 1024 / 1024, 2) AS "索引容量(MB)",ROUND((data_length + index_length) / 1024 / 1024, 2) AS "总容量(MB)"
FROM information_schema.tables
WHERE table_schema = 'my_database'
ORDER BY table_name;
查询结果分析:
- 表名:每个表的名称。
- 记录数:表中的记录数(近似值)。
- 数据容量(MB):表中数据的大小,单位为 MB。
- 索引容量(MB):表中的索引占用空间,单位为 MB。
- 总容量(MB):表的总存储容量(数据和索引的总和),单位为 MB。
输出:
表名 | 记录数 | 数据容量(MB) | 索引容量(MB) | 总容量(MB) |
---|---|---|---|---|
employees | 150,000 | 450.00 | 120.00 | 570.00 |
salaries | 500,000 | 1,250.00 | 750.00 | 2,000.00 |
departments | 12 | 1.00 | 1.00 | 2.00 |
6. 统计某个表的容量
如果想要查看某个特定表的存储容量,可以在 WHERE
子句中同时指定数据库名和表名。以下是针对某个表(例如 my_table
,在 my_database
数据库中)的查询:
SELECT table_name AS "表名",table_rows AS "记录数",ROUND(data_length / 1024 / 1024, 2) AS "数据容量(MB)",ROUND(index_length / 1024 / 1024, 2) AS "索引容量(MB)",ROUND((data_length + index_length) / 1024 / 1024, 2) AS "总容量(MB)"
FROM information_schema.tables
WHERE table_schema = 'my_database'
AND table_name = 'my_table';
查询结果分析:
- 表名:指定的表名。
- 记录数:表中的记录数(近似值)。
- 数据容量(MB):表中数据的大小,单位为 MB。
- 索引容量(MB):表中的索引占用空间,单位为 MB。
- 总容量(MB):表的总存储容量(数据和索引的总和),单位为 MB。
输出:
表名 | 记录数 | 数据容量(MB) | 索引容量(MB) | 总容量(MB) |
---|---|---|---|---|
my_table | 150,000 | 450.00 | 120.00 | 570.00 |
7. 行和列的大小限制
MySQL 的存储不仅受数据库和表的整体容量限制,还受单个行和列的数据存储限制。了解这些限制对于合理设计数据库架构、优化性能至关重要。不同 MySQL 版本和存储引擎(如 InnoDB 和 MyISAM)对行和列的大小限制有所不同。
1. 行的大小限制
- InnoDB 存储引擎:InnoDB 单行最大存储大小为 65,535 字节(约 64 KB),这一限制包括了所有列的总大小(不包括 LOB 类型)。对于
TEXT
、BLOB
等大对象,它们的实际数据存储在外部,而行内只存储指针,因此不受行大小的直接限制。 - MyISAM 存储引擎:MyISAM 存储引擎对单行的最大大小与 InnoDB 类似,也是 65,535 字节(约 64 KB)。不过,MyISAM 允许更灵活的索引和压缩表。
2. 列的大小限制
- VARCHAR 列:在 MySQL 5.7 及更高版本中,
VARCHAR
列的最大长度为 65,535 字节。但由于行的总大小限制,VARCHAR
实际可用的最大长度会更小,特别是当表中有多个大字段时。 - TEXT 和 BLOB 列:对于存储大数据,MySQL 提供了
TEXT
和BLOB
类型。它们的存储限制如下:TINYTEXT
/TINYBLOB
:最大大小 255 字节。TEXT
/BLOB
:最大大小 65,535 字节(64 KB)。MEDIUMTEXT
/MEDIUMBLOB
:最大大小 16,777,215 字节(16 MB)。LONGTEXT
/LONGBLOB
:最大大小 4,294,967,295 字节(4 GB)。
3. 列和行大小的设计建议
- 尽量避免单行包含过多的列:由于行有 64 KB 的大小限制,包含大量大字段(如
BLOB
或TEXT
)的表可能会导致性能下降,甚至无法插入数据。可以考虑将大字段拆分到单独的表中。 - 使用合适的数据类型:对于字符串数据,合理选择
VARCHAR
、TEXT
或BLOB
类型。不要使用超过实际需要的字段长度,这样可以节省存储空间并提高查询性能。
8. MySQL 版本的区别
不同 MySQL 版本对存储限制的支持有所不同。以下是一些主要版本的区别:
1. MySQL 5.6
- InnoDB 的行大小限制:单行最大大小为 64 KB。虽然 LOB(如
TEXT
和BLOB
)存储在外部,但依然受行大小的限制。 - 索引大小:InnoDB 的索引前缀长度受限,默认最多 767 字节。
2. MySQL 5.7
- 动态列存储:MySQL 5.7 引入了对 InnoDB 的动态列存储优化,减少了行记录中空列的存储消耗。
- 大索引支持:通过启用
innodb_large_prefix
,InnoDB 支持更大的索引前缀长度(最多 3072 字节)。
3. MySQL 8.0
- 功能增强:MySQL 8.0 引入了很多性能优化,包括改进的查询优化器、JSON 数据类型支持、窗口函数等,这些改进对大数据量的处理非常有帮助。
- 通用表表达式(CTE):MySQL 8.0 支持 CTE,可以帮助简化复杂查询。
- 全面 UTF-8mb4 支持:MySQL 8.0 默认使用
utf8mb4
,支持完整的 4 字节 UTF-8 字符集。
9.MySQL 存储总量限制和优化
在统计完数据库的容量后,还需要了解 MySQL 数据库的存储总量限制,以及如何通过优化措施来提升存储效率。1. MySQL 存储引擎的限制
MySQL 支持多种存储引擎,不同存储引擎对存储容量的支持不同。以下是常用存储引擎的存储限制:InnoDB 引擎
- 单表最大大小:64TB(与文件系统限制有关)。
- 单数据库最大大小:理论上没有限制,实际取决于硬盘大小及文件系统。
- 索引大小:InnoDB 支持非常大的索引,默认情况下可以存储 767 字节的索引(非 UTF-8 编码),对于 UTF-8 编码,最大索引前缀长度为 191 字节。
InnoDB 引擎的表存储在表空间中,表空间可以由多个数据文件组成,最大支持每个数据文件 64TB,因此总存储量是非常可扩展的。
MyISAM 引擎
- 单表最大大小:256TB(与文件系统限制有关)。
- 索引文件大小:64TB。
- 单数据库最大大小:与硬盘容量及文件系统限制有关。
MyISAM 使用每个表三个文件的方式(.frm
、.MYD
、.MYI
),它依赖文件系统的限制,因此单表最大存储量在文件系统支持的情况下可以达到 256TB。
2. 文件系统的限制
MySQL 的存储大小不仅受存储引擎的限制,还受到底层文件系统的限制。以下是常见文件系统的最大文件大小和分区大小限制:
文件系统 | 最大文件大小 | 最大分区大小 |
---|---|---|
ext4 | 16TB | 1EB |
XFS | 500TB | 8EB |
NTFS | 16TB | 256TB |
ZFS | 16EB | 16EB |
假设 MySQL 表存储在一个支持大文件的文件系统上(如 XFS 或 ZFS),可以轻松达到数百 TB 级别的存储量。
3. 硬件资源的限制
即使 MySQL 和文件系统支持大规模存储,实际的存储容量还取决于硬件资源,如:- 硬盘容量:服务器硬盘的物理容量会直接限制能存储的数据总量。
- 内存大小:内存的大小会影响 MySQL 的缓存能力,进而影响数据库的性能,当数据量很大时,内存不足可能导致频繁的磁盘 I/O,拖慢性能。
- CPU 性能:随着存储数据量的增加,查询和写入操作的复杂性也会增加,对 CPU 性能的要求也会更高。
10. 如何优化存储空间?
了解了数据库和表的存储占用情况后,可以采取一些措施来优化存储空间:
- 清理旧数据:对于不再需要的数据,特别是日志或历史记录,可以考虑删除或归档。
- 压缩表:MySQL 支持表压缩功能(如 InnoDB 压缩表),这可以在不影响性能的情况下减少存储空间的占用。
- 分区表:对于非常大的表,使用表分区可以提高查询性能,同时有助于管理存储空间。
- 优化索引:定期检查表的索引,移除不再使用的索引,减少索引占用的存储空间。
- ……
希望这篇文章能帮助到你,如果有其他问题或建议,欢迎留言讨论!
相关文章:

解析 MySQL 数据库容量统计、存储限制与优化技巧
管理 MySQL 数据库时,了解数据库中的数据量和存储占用情况是非常重要的,尤其是在面对大规模数据时。无论是为了优化数据库性能,还是为了进行容量规划,准确地统计数据库的容量可以帮助我们做出更好的决策。mysql的客户端工具是Navi…...

智能工厂的软件设计 思维进阶与数学程序
本文要点 讨论 “智能工厂的软件设计”中的“数学程序”。 这里 “数学程序” 是指能“格物致知”来理解“相续”一词。 完整的表述是: 思想素养提升的 思维进阶法(三种 数学程序 : 格物致知 )之思维导图: 二叉树及其…...

技术速递|GitHub Copilot upgrade assistant for Java 技术预览发布!
作者:Nick Zhu - Senior Program Manager 排版:Alan Wang 随着人工智能和大型语言模型(LLMs)的不断发展,Agent(“智能代理”)和智能代理化工作流程正在迅速成为AI领域的下一个前沿。这些自主系统…...

淘宝有哪些API是用来获取商品列表的?(商品id列表)
淘宝商品详情接口item_get是通过商品id或者商品链接来获取商品详情数据的,但是不少客户是没有商品id的,这时需要通过接口来拿到商品id。 可以获取商品id的API有: item_search 通过关键字搜索商品列表 item_search_shop 获取店铺所有商品列…...

D59【python 接口自动化学习】- python基础之异常
day59 捕获异常常见问题 学习日期:20241105 学习目标:异常 -- 75 避坑指南:编写捕获异常程序时经常出现的问题 学习笔记: 捕获位置设置不当 设置范围不当 捕获处理设置不当 嵌套try-except语法错误 总结 位置,范围…...

解决 Spring 异步处理中的 JDK 动态代理问题及相关错误分析
解决 Spring 异步处理中的 JDK 动态代理问题及相关错误分析 遇到的问题: 在使用 Spring 的 Async 注解开启异步处理时,遇到以下错误: The bean ServiceImplChannel could not be injected as a com.wn.order.pay.recharge.controller.Serv…...

从xss到任意文件读取
xss一直是一种非常常见且具有威胁性的攻击方式。然而,除了可能导致用户受到恶意脚本的攻击外,xss在特定条件下还会造成ssrf和文件读取,本文主要讲述在一次漏洞挖掘过程中从xss到文件读取的过程,以及其造成的成因。 0x01 前言 xss一…...

nuiapp vue3 uni-ui uni.uploadFile 图片上传
<div style"position: relative;margin-top: 0.8em;"> <div style"position: absolute;left: 1.5em;top: 2em;">施工图片</div> <div style"position: absolute; left: 7em;top: 0em;right: 0em;bottom…...

【计算机科学】位运算:揭开二进制世界的奥秘
位运算是计算机运算的一种基础操作,直接作用于数据的二进制位(bit),在计算机中具有极高的效率。无论是编写高效算法,还是进行底层开发,位运算都扮演着重要角色。本文将从位运算的起源、常见操作符、应用场景…...

弹性裸金属服务器和传统裸金属服务器有什么区别?
弹性裸金属服务器是一种结合了传统裸金属服务器和云计算资源两种特点的服务器,是一种云计算服务,下面我们就来了解一下弹性裸金属服务器和传统裸金属服务器之间有什么区别吧! 弹性裸金属服务器能够支持企业快速部署新的硬件和软件系统&#x…...

shodan(五)连接Mongodb数据库Jenkinsorg、net、查看waf命令
声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人一律不承担一切后果 引言: 1.Shodan 是一个专门用于搜索连…...

ThingsBoard规则链节点:Push to Edge节点详解
引言 1. Push to Edge 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 边缘计算 3.2 本地数据处理 3.3 实时响应 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台,提供了设备管…...

基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力
作者:肯梦 本文将演示如何使用事件总线(EventBridge),向量检索服务(DashVector),函数计算(FunctionCompute)结合灵积模型服务 [ 1] 上的 Embedding API [ 2] ࿰…...

【golang/navmesh】使用recast navigation进行寻路
目录 说在前面安装使用可视化 说在前面 go version:1.20.2 linux/amd64操作系统:wsl2detour-go版本:v0.2.0github:这里,求star! 安装 使用go mod安装即可go get github.com/o0olele/detour-go使用 使用场景模型构建n…...

【软考】Redis不同的数据类型和应用场景。
Redis的不同数据类型和对应的应用场景: Redis 数据类型及其应用场景 String(字符串) 特点:简单的值存储,支持二进制数据。应用场景: 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量࿰…...

java 对人名和电话 脱敏-replaceAll
学习了《正则匹配人名》和《正则匹配电话号码》,如果要一起进行脱敏处理,改怎么做? 脱敏的,考虑配置规则,进行匹配的方式进行处理: 脱敏规则: DesensitizationRules Data public class Desens…...

计算机网络:网络层 —— 网络地址转换 NAT
文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小…...

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦
一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理:输入测试文本为herf的属性值和内容值,所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…...

面向制造和装配的产品设计指南(二):面向装配的设计指南
参考引用 面向制造和装配的产品设计指南 1. 概述 1.1 装配的概念 装配是指把多个零件组装成产品,使得产品能够实现相应的功能并体现产品的质量,装配包含三层含义 把零件组装在一起实现相应的功能体现产品的质量 1.2 最好和最差的装配工序 1.3 面向装…...

Python中的PDF处理工具:PyPDF2和ReportLab使用指南
Python中的PDF处理工具:PyPDF2和ReportLab使用指南 在日常工作和项目中,PDF 文件处理是个常见需求,不论是合并报告、加密文档、填充表单,还是生成发票。Python 中有许多用于操作 PDF 文件的库,其中 PyPDF2 和 ReportL…...

【vxe-table】多选筛选项对列表的列进行动态的显示与隐藏
需求: 列表的组成部分由:一些固定的列,如:姓名,工号,以及 需要动态显示与隐藏的列,如:出勤、旷工、事假、病假等假勤类型 1、通过多选框多选,展示选中的列,未选中的不展示…...

微信小程序uniapp+vue飞机订票航空售票系统
文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对于小程序飞机订票信息管理所牵扯的信息管理及数据保存都是非常多的,举例像所有的管理员;管理员…...

如何取消Outlook中的循环会议
如何取消Outlook中的循环会议 参考链接:https://iknow.lenovo.com.cn/detail/195430 1、打开Outlook,进入 日历 视图界面; 2、 选择并双击要取消的循环会议; 3、 在 打开定期项目 对话框中选择整个序列,然后单击 确…...

Docker-- cgroups资源控制实战
上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…...

使用Python和Vosk库实现语音识别
使用Python和Vosk库实现语音识别 在人工智能和机器学习领域,语音识别技术正变得越来越重要。Python作为一种强大的编程语言,拥有丰富的库和框架,可以方便地实现语音识别功能。今天,我们将介绍如何使用Python中的SpeechRecognitio…...

stm32使用串口的轮询模式,实现数据的收发
------内容以b站博主keysking为原型,整理而来,用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略,只讲重点设置。 这里我配置的是USART2的模式。 会发现,PA2和PA3分别是TX与RX,在连接串口时需要TX对RX&…...

105. UE5 GAS RPG 搭建主菜单
在这一篇,我们将实现对打开游戏显示的主菜单进行搭建,主菜单将显示游戏主角,游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景,前面可以显示对应的UI控件,用于玩家操作&#…...

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统
基于 JAVASSM(Java Spring Spring MVC MyBatis)框架开发一个医院挂号系统是一个实用的项目。 步骤一:需求分析 明确系统需要实现的功能,比如: 用户注册和登录查看医生列表预约挂号查看预约记录取消预约管理员管…...

Golang | Leetcode Golang题解之第540题有序数组中的单一元素
题目: 题解: func singleNonDuplicate(nums []int) int {low, high : 0, len(nums)-1for low < high {mid : low (high-low)/2mid - mid & 1if nums[mid] nums[mid1] {low mid 2} else {high mid}}return nums[low] }...

影刀RPA实战:嵌入python,如虎添翼
1. 影刀RPA与Python的关系 影刀RPA与Python的关系可以从以下几个方面来理解: 技术互补:影刀RPA是一种自动化工具,它允许用户通过图形化界面创建自动化流程,而Python是一种编程语言,常用于编写自动化脚本。影刀RPA可以…...