当前位置: 首页 > news >正文

解析 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)
employees150,000450.00120.00570.00
sales3,500,00022,870.0015,340.0038,210.00
test_db1001.001.002.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)
employees150,000450.00120.00570.00
salaries500,0001,250.00750.002,000.00
departments121.001.002.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_table150,000450.00120.00570.00

7. 行和列的大小限制

  MySQL 的存储不仅受数据库和表的整体容量限制,还受单个行和列的数据存储限制。了解这些限制对于合理设计数据库架构、优化性能至关重要。不同 MySQL 版本和存储引擎(如 InnoDB 和 MyISAM)对行和列的大小限制有所不同。

1. 行的大小限制

  • InnoDB 存储引擎:InnoDB 单行最大存储大小为 65,535 字节(约 64 KB),这一限制包括了所有列的总大小(不包括 LOB 类型)。对于 TEXTBLOB 等大对象,它们的实际数据存储在外部,而行内只存储指针,因此不受行大小的直接限制。
  • MyISAM 存储引擎:MyISAM 存储引擎对单行的最大大小与 InnoDB 类似,也是 65,535 字节(约 64 KB)。不过,MyISAM 允许更灵活的索引和压缩表。

2. 列的大小限制

  • VARCHAR 列:在 MySQL 5.7 及更高版本中,VARCHAR 列的最大长度为 65,535 字节。但由于行的总大小限制,VARCHAR 实际可用的最大长度会更小,特别是当表中有多个大字段时。
  • TEXT 和 BLOB 列:对于存储大数据,MySQL 提供了 TEXTBLOB 类型。它们的存储限制如下:
    • 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 的大小限制,包含大量大字段(如 BLOBTEXT)的表可能会导致性能下降,甚至无法插入数据。可以考虑将大字段拆分到单独的表中。
  • 使用合适的数据类型:对于字符串数据,合理选择 VARCHARTEXTBLOB 类型。不要使用超过实际需要的字段长度,这样可以节省存储空间并提高查询性能。

8. MySQL 版本的区别

  不同 MySQL 版本对存储限制的支持有所不同。以下是一些主要版本的区别:

1. MySQL 5.6

  • InnoDB 的行大小限制:单行最大大小为 64 KB。虽然 LOB(如 TEXTBLOB)存储在外部,但依然受行大小的限制。
  • 索引大小: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 的存储大小不仅受存储引擎的限制,还受到底层文件系统的限制。以下是常见文件系统的最大文件大小和分区大小限制:

文件系统最大文件大小最大分区大小
ext416TB1EB
XFS500TB8EB
NTFS16TB256TB
ZFS16EB16EB

假设 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…...

【计算机科学】位运算:揭开二进制世界的奥秘

位运算是计算机运算的一种基础操作&#xff0c;直接作用于数据的二进制位&#xff08;bit&#xff09;&#xff0c;在计算机中具有极高的效率。无论是编写高效算法&#xff0c;还是进行底层开发&#xff0c;位运算都扮演着重要角色。本文将从位运算的起源、常见操作符、应用场景…...

弹性裸金属服务器和传统裸金属服务器有什么区别?

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

shodan(五)连接Mongodb数据库Jenkinsorg、net、查看waf命令

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 引言&#xff1a; 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 是一个开源的物联网平台&#xff0c;提供了设备管…...

基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力

作者&#xff1a;肯梦 本文将演示如何使用事件总线&#xff08;EventBridge&#xff09;&#xff0c;向量检索服务&#xff08;DashVector&#xff09;&#xff0c;函数计算&#xff08;FunctionCompute&#xff09;结合灵积模型服务 [ 1] 上的 Embedding API [ 2] &#xff0…...

【golang/navmesh】使用recast navigation进行寻路

目录 说在前面安装使用可视化 说在前面 go version&#xff1a;1.20.2 linux/amd64操作系统&#xff1a;wsl2detour-go版本&#xff1a;v0.2.0github&#xff1a;这里&#xff0c;求star! 安装 使用go mod安装即可go get github.com/o0olele/detour-go使用 使用场景模型构建n…...

【软考】Redis不同的数据类型和应用场景。

Redis的不同数据类型和对应的应用场景&#xff1a; Redis 数据类型及其应用场景 String&#xff08;字符串&#xff09; 特点&#xff1a;简单的值存储&#xff0c;支持二进制数据。应用场景&#xff1a; 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量&#xff0…...

java 对人名和电话 脱敏-replaceAll

学习了《正则匹配人名》和《正则匹配电话号码》&#xff0c;如果要一起进行脱敏处理&#xff0c;改怎么做&#xff1f; 脱敏的&#xff0c;考虑配置规则&#xff0c;进行匹配的方式进行处理&#xff1a; 脱敏规则&#xff1a; DesensitizationRules Data public class Desens…...

计算机网络:网络层 —— 网络地址转换 NAT

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

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

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

面向制造和装配的产品设计指南(二):面向装配的设计指南

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

Python中的PDF处理工具:PyPDF2和ReportLab使用指南

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

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...