在MySQL日常运维和SQL优化中,看清一张表上到底建了哪些索引、每个索引覆盖了什么字段、是否唯一、区分度如何,是第一步要做的事。MySQL本身提供了多种查看索引的命令和系统表,不需要借助第三方工具就能完成。
一、使用SHOW INDEX命令查看
最直接的方式是在MySQL客户端中执行SHOW INDEX语句。它的语法非常简单,后面跟上FROM和表名即可。该命令会返回一张二维结果集,每一行代表索引中的某一个字段(对于联合索引会拆成多行)。
下面以一个用户表为例,先建表并创建普通索引和联合索引,再查看其索引信息:
-- 创建测试表 CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT, city VARCHAR(20), KEY idx_name (name), KEY idx_age_city (age, city) ) ENGINE=InnoDB; -- 查看索引 SHOW INDEX FROM user_info;
执行后结果中几个关键列需要重点关注:Key_name表示索引名称,如果是PRIMARY说明是主键;Column_name是索引包含的字段;Non_unique为0表示唯一索引,1表示允许重复;Seq_in_index表示该字段在联合索引中的顺序,从1开始;Cardinality是基数,代表索引中不同值的估算数量,这个值越大说明区分度越高,对查询越有利。
对于联合索引idx_age_city,你会看到两行记录,Seq_in_index分别是1和2,对应age和city。通过这种方式,你可以直观确认联合索引的最左前缀字段,从而判断类似WHERE city = '北京'这种不走索引的查询。
二、查询information_schema系统表
除了命令行式的SHOW语句,MySQL把索引元数据存放在information_schema.statistics表中。用SELECT方式查询,好处是可以加WHERE条件做筛选,也能和其他系统表关联。
例如,只想看非唯一索引,或者只想看某个库下所有表的索引数量,用SQL比肉眼翻SHOW结果更高效:
-- 查看当前库下某表的非唯一索引 SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, NON_UNIQUE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'user_info' AND NON_UNIQUE = 1 ORDER BY INDEX_NAME, SEQ_IN_INDEX;
这种写法返回的是标准关系型结果,方便导出到Excel或程序中做进一步分析。Cardinality列同样存在,但注意系统表中的数值是统计信息估算值,可能和真实数据分布有偏差,需要配合ANALYZE TABLE更新。
如果你要批量检查多个表是否存在冗余索引,也可以自关联statistics表,找出字段集合相同的不同索引名。这比手工比对SHOW输出要可靠得多,也更适合写进巡检脚本。
三、使用EXPLAIN辅助确认索引使用情况
查看索引定义只是静态结构,真正关心的是某条SQL会不会用上索引。这时可以把查看索引命令和EXPLAIN结合起来。
先通过SHOW INDEX确认有idx_name,再对查询做执行计划分析:
-- 查看索引结构 SHOW INDEX FROM user_info; -- 分析查询是否使用索引 EXPLAIN SELECT * FROM user_info WHERE name = '张三';
在EXPLAIN输出里,key列会显示实际使用的索引名,如果为NULL说明没走索引。possible_keys则列出优化器考虑过的索引。把这两者和SHOW INDEX的结果对照,就能明白为什么某些查询明明建了索引却用不上,比如因为函数包裹字段、隐式类型转换或偏离最左前缀。
实际优化时,建议先跑SHOW INDEX摸清家底,再写EXPLAIN验证猜测。两者配合,可以避免盲目添加新索引造成写性能下降和磁盘浪费。
四、注意事项与常见误区
很多人在查看索引时只盯著Key_name和Column_name,忽略了Cardinality。其实低基数字段(如性别)单独建索引往往没用,优化器可能直接选全表扫描。查看索引命令展示的基数能帮你提前发现这类问题。
另外,SHOW INDEX看到的是表当前的索引定义,但不包括被优化器软删除但尚未物理清理的残留结构(极少数异常场景)。如果怀疑元数据不一致,可以查询information_schema.innodb_indexes做交叉验证,不过该表属于InnoDB内部视图,通常不需要常规查看。
最后提醒,查看索引本身只会产生元数据读锁,基本不影响线上,但在大表极频繁执行脚本时仍建议放在从库或低峰期。掌握mysql查看索引命令,是写好每条SQL前最值得花的一分钟。
mysql查看索引show_index修改时间:2026-08-06 14:18:29