查 INFORMATION_SCHEMA.INNODB_SYS_INDEXES 和 INNODB_SYS_TABLESPACES 可估算索引大小,但需结合 index_type 与页数;最准方法是用 du -h 查 .ibd 文件或通过 DROP INDEX 前后对比磁盘变化。

查 information_schema.TABLES 只能看表大小,不包括索引
很多人执行 SELECT * FROM information_schema.TABLES WHERE TABLE_NAME = 'xxx',发现 DATA_LENGTH 和 INDEX_LENGTH 加起来远小于实际磁盘占用,甚至为 0。这是因为 MySQL 的 information_schema.TABLES 中的 INDEX_LENGTH 字段在 InnoDB 表上**不准确或始终为 0**(尤其 MySQL 8.0+ 默认关闭 innodb_stats_persistent 或未更新统计时)。它反映的是统计估算值,不是真实物理占用。
- 真正想看“这个索引占了多少字节”,不能依赖
INDEX_LENGTH -
DATA_LENGTH是聚簇索引(即主键+行数据)的近似大小,但也不含二级索引的独立存储空间 - 该视图适合粗略判断表膨胀趋势,不适合做索引空间审计
用 sys.schema_index_statistics 看索引读写开销,但不提供大小
sys 库是 MySQL 自带的性能视图封装,schema_index_statistics 能告诉你某个索引被 SELECT 扫了多少次、INSERT 更新了多少次,但它**完全不记录磁盘空间信息**。这是常见误解:把“使用频率”当“体积大小”。
- 它底层查的是
performance_schema的事件计数器,和文件系统无关 - 即使一个索引从未被查询过,只要建了,就占磁盘;反之,高频索引也可能很小(比如单列
TINYINT) - 别在这里找
bytes、size、disk_usage字段——它没有
真实查看索引大小:查 INFORMATION_SCHEMA.INNODB_SYS_INDEXES + INNODB_SYS_TABLESPACES
InnoDB 引擎下,索引以 B+ 树形式存在独立的页(page)中,每个索引对应一个 INDEX_ID,而表空间(SPACE)对应物理文件(如 ibdata1 或独立 .ibd)。要算出某索引的近似大小,得关联这两个视图:
SELECT i.NAME AS index_name, t.NAME AS table_name, t.FILE_SIZE AS tablespace_file_size, t.ALLOCATED_SIZE AS tablespace_allocated_size, i.PAGE_NO AS root_page_no, i.TYPE AS index_type FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES t ON i.TABLE_ID = t.TABLE_ID WHERE t.NAME = 'your_db/your_table';
-
FILE_SIZE和ALLOCATED_SIZE是整个表空间大小(单位字节),不是单个索引的——但你可以结合index_type(2=二级索引,3=聚簇索引)和页数量估算比例 - 更准的做法是用
mysqlshow -v your_db your_table(命令行),它会解析 .ibd 文件头并报告各索引的页数,再乘以innodb_page_size(默认 16KB) - 注意:如果启用了
innodb_file_per_table=OFF,所有表共用ibdata1,此时无法分离出单个索引大小,只能整体评估
用 du -h 看物理文件是最准的,但需权限和停写保障
对独立表空间(innodb_file_per_table=ON,默认),每个表对应一个 your_db/your_table.ibd 文件。虽然它包含数据+所有索引,但可以配合 pt-online-schema-change 或临时删索引对比法来反推:
- 先
du -h /var/lib/mysql/your_db/your_table.ibd记下原始大小 -
DROP INDEX idx_name ON your_table(确保有备库或可回滚) - 执行
OPTIMIZE TABLE your_table或等 purge 完成(避免空页残留) - 再
du -h,两次差值 ≈ 该索引净占用(含 B+ 树结构开销) - 风险:
DROP INDEX会锁表(除非 MySQL 5.6+ ALGORITHM=INPLACE),且不可逆——务必先备份
索引空间不是简单的“字段长度 × 行数”,B+ 树层级、填充因子、页分裂、前缀索引截断、NULL 处理都会显著影响结果。别信估算值,真要压降空间,得实测文件大小变化。










