用 SHOW INDEX FROM 最直接查看表索引,它不依赖权限、输出关键字段如 Key_name、Column_name、Seq_in_index 和 Non_unique,且能完整显示全文索引、前缀索引和函数索引等类型。

怎么看表里有哪些索引:用 SHOW INDEX FROM 最直接
MySQL 里查索引,SHOW INDEX FROM 是最常用也最可靠的命令,它不依赖信息模式视图权限,连低权限用户也能跑(只要对表有 SELECT 权限)。输出字段多,但关键就几个:Key_name 是索引名,Column_name 是哪列,Seq_in_index 表示复合索引里的顺序,Non_unique 为 0 就是唯一索引。
实操建议:
- 必须指定数据库名或先
USE db_name,否则会报错ERROR 1146 (42S02): Table 'table_name' doesn't exist - 表名区分大小写,Linux 下尤其注意——
SHOW INDEX FROM User和SHOW INDEX FROM user可能不是同一个表 - 如果只关心主键和唯一索引,过滤
WHERE Key_name IN ('PRIMARY', 'UNIQUE')没用,因为SHOW INDEX不支持 WHERE;得靠客户端处理或改用INFORMATION_SCHEMA.STATISTICS
为什么 EXPLAIN 看不了索引定义,只能看查询时用了哪个
EXPLAIN 的作用是模拟查询执行计划,它告诉你优化器“选了哪个索引”,但不会列出表上“有哪些索引”。比如你删掉一个索引,EXPLAIN 结果可能不变(因为优化器换了别的),但你根本不知道那个索引已被删。
常见误解场景:
- 执行
EXPLAIN SELECT * FROM t WHERE a=1显示key: idx_a,不代表idx_a一定存在——可能是旧缓存、或者你刚 DROP 却没刷新元数据 -
EXPLAIN不显示全文索引、空间索引、隐藏的聚簇索引(InnoDB 的 PRIMARY KEY),这些都得靠SHOW INDEX或查INFORMATION_SCHEMA - 如果
EXPLAIN的type是ALL,第一反应不该是“索引坏了”,而是先用SHOW INDEX FROM确认索引还在不在、列顺序对不对
用 INFORMATION_SCHEMA.STATISTICS 查索引更灵活,但要注意权限和性能
当你要批量查多个表、按列名反向找索引、或者写监控脚本时,INFORMATION_SCHEMA.STATISTICS 比 SHOW INDEX 更好用。它本质是一张系统视图,支持标准 SQL 查询。
实操要点:
- 必须加
WHERE TABLE_SCHEMA = 'your_db',否则默认查所有库,慢且可能被拒绝(尤其在 MySQL 8.0+ 默认关闭innodb_stats_on_metadata) -
SEQ_IN_INDEX字段对应SHOW INDEX的Seq_in_index,别和ORDINAL_POSITION混——后者是列在表里的顺序,无关索引 - MySQL 5.7 中,
STATISTICS视图不包含隐藏主键(GEN_CLUST_INDEX),8.0 起才统一;而SHOW INDEX在所有版本都稳定返回 - 不要在大表上频繁查这个视图,它会触发统计信息更新,影响并发 DML 性能
容易漏掉的索引类型:全文索引、前缀索引、函数索引(8.0.13+)
SHOW INDEX FROM 全部能列出来,但字段含义不同,稍不注意就误判:
- 全文索引的
Index_type是FULLTEXT,Collation列为NULL,不是“没建好”,是设计如此 - 前缀索引(如
INDEX idx_name (name(10)))会在Sub_part字段显示数字 10,如果为NULL表示整列索引;这个值直接影响WHERE name LIKE 'abc%'是否能走索引 - 函数索引(如
INDEX idx_upper (UPPER(email)))在Column_name显示表达式字符串,不是真实列名,SHOW INDEX输出里会是UPPER(`email`)—— 注意反引号和括号,别当成列名去查 - MySQL 8.0 后,函数索引默认不可见,除非设置
show_compatibility_56 = OFF(默认值),否则SHOW INDEX会跳过它
索引是否生效,从来不只是“有没有”,而是“结构对不对”“查询条件能不能匹配上”“优化器有没有选错”。SHOW INDEX FROM 是起点,不是终点;尤其当 Sub_part、Index_type、Expression 这些字段出现非空或非常规值时,得多盯两眼。











