Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL查看索引占用及排查冗余索引

MySQL查看索引占用空间大小、排查冗余索引的实战详解

作者:ULIi096kr

很多MySQL磁盘空间爆满、查询性能卡顿、写入变慢的核心原因,并非业务数据过多,而是索引冗余、索引占用空间过大,本文基于MySQL5.7/8.0,详解如何一键查询数据库、数据表索引占用空间,精准定位大索引、冗余索引,附带全套索引瘦身优化方案,需要的朋友可以参考下

摘要:很多MySQL磁盘空间爆满、查询性能卡顿、写入变慢的核心原因,并非业务数据过多,而是索引冗余、索引占用空间过大。大量项目存在重复索引、无效索引、超大字段索引,导致索引空间远超数据空间,严重浪费磁盘和内存资源。本文基于MySQL5.7/8.0,详解如何一键查询数据库、数据表索引占用空间,精准定位大索引、冗余索引,附带全套索引瘦身优化方案,生产环境直接落地,快速释放磁盘空间、提升数据库性能。

核心关键词:MySQL查看索引占用空间、MySQL索引大小查询、MySQL冗余索引排查、MySQL索引瘦身优化、MySQL索引占用磁盘过高

一、前言

在MySQL运维优化中,绝大多数开发者只关注业务数据的空间占用,却长期忽略索引空间的隐形消耗。

实际生产场景中,很多库表数据量只有几GB,但是索引占用空间达到十几GB甚至几十GB,造成:磁盘空间莫名爆满、数据库备份文件巨大、数据插入/更新/删除耗时变长、缓冲池命中率降低、查询性能卡顿等一系列问题。

不同于常规的库表空间查询,本文专门针对索引空间统计、大索引排查、冗余索引清理做深度实战讲解,解决索引空间溢出、资源浪费的核心痛点,是MySQL性能优化与磁盘瘦身的核心干货。

二、核心认知:为什么索引会占用超大空间?

想要优化索引空间,首先要明白索引空间膨胀的核心原因,避免盲目删索引导致业务异常:

行业通用标准:正常表索引空间应小于等于数据空间,索引远超数据空间,必然存在优化空间

三、实战SQL:查询MySQL索引占用空间(全场景)

所有语句兼容MySQL5.7、8.0,适配自建MySQL、阿里云/腾讯云RDS,可直接复制执行,精准统计索引占用磁盘大小。

3.1 查看所有数据库索引总占用空间

全局盘点所有业务库的索引总容量,快速定位索引空间溢出的数据库,适合全局巡检:

SELECT TABLE_SCHEMA AS 数据库名, ROUND(SUM(INDEX_LENGTH)/1024/1024,2) AS 索引总空间_MB, ROUND(SUM(INDEX_LENGTH)/1024/1024/1024,3) AS 索引总空间_GB, ROUND(SUM(DATA_LENGTH)/1024/1024,2) AS 数据空间_MB, ROUND((SUM(INDEX_LENGTH)/SUM(DATA_LENGTH))*100,2) AS 索引数据占比_百分比 FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys') GROUP BY TABLE_SCHEMA ORDER BY 索引总空间_GB DESC;

结果解读

3.2 查询指定库所有表索引大小(精准排查大索引表)

定位问题数据库后,一键查询库内所有表的索引空间、数据空间、空间占比,快速找出索引超大的数据表:

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, ROUND((INDEX_LENGTH/(DATA_LENGTH+INDEX_LENGTH))*100,2) AS 索引占比_%, ENGINE AS 存储引擎 FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' ORDER BY 索引空间_MB DESC;

3.3 筛选索引异常的风险表(自动过滤问题表)

自定义阈值,自动筛选索引占比过高的风险表,无需人工排序,批量定位优化目标:

SELECT TABLE_NAME AS 风险表名, ROUND(DATA_LENGTH/1024/1024,2) AS 数据空间_MB, ROUND(INDEX_LENGTH/1024/1024,2) AS 索引空间_MB, ROUND((INDEX_LENGTH/DATA_LENGTH)*100,2) AS 索引超数据倍数 FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' AND INDEX_LENGTH > DATA_LENGTH ORDER BY 索引超数据倍数 DESC;

场景用途:批量筛选索引空间大于数据空间的异常表,是索引瘦身的核心目标。

四、进阶实战:精准查询单条索引占用空间

上面的语句只能统计整表索引总空间,无法查看单条索引的大小。想要精准删除无用大索引,需要查询每张表具体的索引名称、字段、占用空间。

MySQL无直接查询单索引大小的原生语句,可通过系统表结合规则精准分析,搭配以下命令查看表所有索引结构:

# 查看表所有索引详情 
SHOW INDEX FROM 你的表名;

结合上表统计的整表索引空间,可精准判断:长字段索引、联合索引、废弃索引是空间占用元凶。

五、核心技能:MySQL冗余索引排查方法

冗余索引是索引空间浪费的首要原因,很多项目存在大量重复、可替代的索引,只会占用磁盘、拖慢写入,对查询无任何帮助。

5.1 冗余索引判定规则

5.2 查询数据库未使用的索引(精准清理)

通过性能模式查询长期闲置的索引,这类索引100%可以删除,安全释放空间:

SELECT OBJECT_NAME AS 表名, INDEX_NAME AS 未使用索引名 FROM performance_schema.table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA = '你的数据库名';

六、MySQL索引空间瘦身优化方案(生产可用)

针对索引空间过大、冗余过多的问题,整理4套生产级优化方案,按安全优先级排序,零 风险释放磁盘空间。

6.1 删除所有冗余、未使用索引(首选)

清理系统检测出的未使用索引、前缀冗余索引,无业务风险、效果最明显,是索引瘦身第一选择。

删除语法:DROP INDEX 索引名 ON 表名;

6.2 优化大字段索引

禁止对超长字符串字段建立全字段索引,优化方案:

6.3 合并重复联合索引

将多张零散的单字段索引、短联合索引,合并为最优联合索引,减少索引数量,兼顾查询性能与空间占用。

6.4 清理索引碎片

索引长期增删改会产生大量碎片,导致索引空间虚高,低峰期执行优化:

OPTIMIZE TABLE 表名;

执行后可回收索引空闲碎片,降低磁盘占用,提升索引检索效率。

七、索引优化避坑指南(生产必看)

八、总结

MySQL磁盘空间爆满、性能卡顿,索引冗余膨胀是极易被忽略的核心诱因。相比于清理业务数据,优化索引空间零业务损耗、见效快,是数据库运维瘦身的最优方案。

本文全套SQL可一键统计全库、单表索引占用空间,精准定位异常大索引和冗余索引,搭配成熟的索引瘦身方案,可快速释放大量磁盘空间,同时提升数据库读写性能。建议所有运维人员定期执行索引空间巡检,从根源解决索引空间浪费问题。

以上就是MySQL查看索引占用空间大小、排查冗余索引的实战详解的详细内容,更多关于MySQL查看索引占用及排查冗余索引的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文