首页/数据/数据库速查/SHOW INDEX 查看表索引

SHOW INDEX 查看表索引

列出索引名称、列序、唯一性、Cardinality 与索引类型,用于核对索引现状和评估选择性。

数据库速查数据更新于 2026-10-13

SHOW INDEX 的作用

SHOW INDEX FROM 表名 列出该表的全部索引定义:索引名、列在索引中的顺序、是否唯一、索引类型以及基数估算值。它是核对索引现状、评估索引选择性最直接的入口,配合 information_schema.statistics 还能批量统计全库索引数量,用于发现冗余索引与索引过多带来的写入成本。

基本信息

适用平台MySQL 5.7 / 8.0、MariaDB
语法SHOW INDEX FROM tbl [FROM db] [WHERE ...]
关键列Key_name、Seq_in_index、Cardinality、Index_type、Non_unique
权限需要对该表的任意权限(如 SELECT)
等价视图information_schema.statistics

典型使用场景

  • 上线前核对表上的索引是否按设计建好,特别是复合索引的列序
  • 排查慢查询时确认过滤条件的第一列是否命中索引最左前缀
  • 评估索引选择性:Cardinality 与表行数的比值越接近 1 越好
  • 统计各表索引数量,发现只增不减的冗余索引并评估删除
  • 核对唯一约束是否真的建立(Non_unique 为 0 才是唯一索引)

查看与批量统计

查看与批量统计
-- 单表索引清单
SHOW INDEX FROM orders;
-- 只看某个索引
SHOW INDEX FROM orders WHERE Key_name = 'idx_uid_status';
-- 批量统计各表索引条数,顺序按数量倒排
SELECT table_name, COUNT(DISTINCT index_name) AS idx_cnt
FROM information_schema.statistics
WHERE table_schema = 'appdb'
GROUP BY table_name
ORDER BY idx_cnt DESC;
-- 刷新统计信息后再看基数
ANALYZE TABLE appdb.orders;

输出逐列读法

列名含义正常与异常
Key_name索引名,PRIMARY 是主键缺失预期索引说明建表语句未落地
Seq_in_index该列在索引中的位置,从 1 开始复合索引列序与查询条件不一致会导致用不上
Column_name索引列名出现意外列说明建成顺序写错
Non_unique0 表示唯一索引,1 表示普通索引唯一约束没生效时应为 0 却显示 1
Cardinality不同值的估算个数与真实去重数差几个数量级会误导优化器
Index_type通常为 BTREE,全文索引为 FULLTEXT出现非预期类型需确认是否建错
Cardinality 是采样估算值,大比例数据变更后会失真:先用 ANALYZE TABLE 刷新统计信息,再看索引选择性与执行计划,结论才可靠。
删索引属于结构变更:先确认没有查询依赖该索引(可查 performance_schema.table_io_waits_summary_by_index_usage),并避开业务高峰执行 DDL。

易错点

  • 复合索引列序写反:查询条件用不上索引,执行计划退化为全表扫描,而 SHOW INDEX 里看起来「索引是有的」
  • Cardinality 严重失真时优化器可能放弃索引,先 ANALYZE TABLE 再复看执行计划,不要急着加新索引
  • 把索引数量当成好事:每个索引都要在写入时维护,索引过多会拖慢 INSERT/UPDATE 并占用磁盘
  • 只看索引名判断功能:同名不同列序的索引在 SHOW INDEX 里靠 Seq_in_index 区分,改名不改序无法解决查询失效

数据来源与参考

  • MySQL 8.0 Reference Manual: SHOW INDEX Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌