MySQL 运维 SQL 备忘

💡 原文中文,约1400字,阅读约需4分钟。
📝

内容提要

本文介绍MySQL运维常用SQL:通过查询information_schema.tables,统计所有数据库、单个数据库、单库各表及指定表的数据与索引占用大小,并按数据量降序排列,便于容量管理。

🔎

延伸解读

容量管理从 information_schema 入手

文章给出的查询都基于 information_schema.tables,这是 MySQL 自带的元数据表,无需额外工具即可获取数据与索引的占用信息。对于日常运维,这意味着可以快速定位哪些库或表占用了较多空间,从而为容量规划、清理或归档提供依据。

不同粒度查询的适用场景

文章覆盖了从所有数据库、单个数据库、单库各表到指定表的四种查询粒度。实际使用时,可按需选择:全局概览适合发现异常增长的库,单库汇总适合评估整体使用量,单表列表则便于找出大表,而指定表查询可用于深入分析特定表的空间构成。

关注数据、索引与空闲空间

部分查询同时返回 data_size、index_size、max_data_size 和 data_free。其中 data_free 表示已分配但未使用的空间,若该值较大,可能意味着存在碎片或可回收空间。结合索引大小,还能判断索引是否占用过多,为优化提供参考。

使用时的注意事项

查询结果中的大小单位经过换算并保留两位小数,便于阅读。但需注意,information_schema 的数据可能并非实时精确,且查询本身可能对性能有轻微影响。此外,示例中的数据库名和表名需替换为实际名称,排序默认按数据量降序,方便优先关注大对象。

❓

Q&A

如何查询MySQL中所有数据库各自占用的空间大小?

使用以下SQL:SELECT TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),'MB') AS data_size, concat(truncate(sum(index_length)/1024/1024,2),'MB') AS index_size FROM information_schema.tables GROUP BY TABLE_SCHEMA ORDER BY data_length DESC; 该查询会列出每个数据库的数据和索引大小,并按数据大小降序排列。

怎么查看MySQL中某个数据库的总占用大小?

使用以下SQL(将'数据库名'替换为实际数据库名):SELECT CONCAT(TRUNCATE(SUM(data_length)/1024/1024,2), 'MB') AS data_size, CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB') AS max_data_size, CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB') AS data_free, CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB') AS index_size FROM information_schema.tables WHERE TABLE_SCHEMA = '数据库名'; 结果包含数据大小、最大数据大小、空闲空间和索引大小。

如何列出MySQL中某个数据库下所有表各自占用的空间?

使用以下SQL(将'数据库名'替换为实际数据库名):SELECT TABLE_NAME, concat(truncate(data_length/1024/1024,2), 'MB') AS data_size, concat(truncate(index_length/1024/1024,2),'MB') AS index_size FROM information_schema.tables where TABLE_SCHEMA = '数据库名' GROUP BY TABLE_NAME ORDER BY data_length DESC; 该查询会显示每个表的数据和索引大小,并按数据大小降序排列。

怎么查询MySQL中某个指定表占用的空间大小?

使用以下SQL(将'表名'替换为实际表名):SELECT CONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB') AS data_size, CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB') AS max_data_size, CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB') AS data_free, CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB') AS index_size FROM information_schema.tables WHERE TABLE_NAME = '表名'; 结果包含数据大小、最大数据大小、空闲空间和索引大小。

MySQL中查询数据库大小时,数据大小和索引大小分别代表什么?

数据大小(data_size)是表中数据占用的空间,索引大小(index_size)是索引占用的空间。查询结果通常以MB为单位显示,通过truncate函数保留两位小数。

为什么在MySQL运维中需要查询数据库和表的占用大小?

查询数据库和表的占用大小有助于进行容量管理,例如监控存储增长、规划磁盘空间、优化表结构或索引,以及识别异常增长的表。

🏷️

标签

➡️

继续阅读