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_unique | 0 表示唯一索引,1 表示普通索引 | 唯一约束没生效时应为 0 却显示 1 |
| Cardinality | 不同值的估算个数 | 与真实去重数差几个数量级会误导优化器 |
| Index_type | 通常为 BTREE,全文索引为 FULLTEXT | 出现非预期类型需确认是否建错 |
Cardinality 是采样估算值,大比例数据变更后会失真:先用 ANALYZE TABLE 刷新统计信息,再看索引选择性与执行计划,结论才可靠。
删索引属于结构变更:先确认没有查询依赖该索引(可查 performance_schema.table_io_waits_summary_by_index_usage),并避开业务高峰执行 DDL。