MySQL查看表索引

MySQL查看表索引

引言

排查慢查询、判断索引是否生效前,先要搞清楚一张表上到底建了哪些索引、每个索引包含哪些列、是不是唯一索引。SHOW INDEX和information_schema都能查,前者直观,后者适合脚本批量统计。

SHOW INDEX查看索引

SHOW INDEX FROM users;

列出users表全部索引,Key_name是索引名,Column_name是索引列,Seq_in_index是列在联合索引里的顺序,Non_unique为0表示唯一索引。

重点字段含义

  • Key_name:索引名,PRIMARY是主键;
  • Seq_in_index:联合索引中的列顺序,最左前缀从这里判断;
  • Column_name:该索引包含的列;
  • Non_unique:0唯一,1普通;
  • Sub_part:前缀索引长度;
  • Cardinality:基数,越接近总行数区分度越好。

建表语句里看索引

SHOW CREATE TABLE users\G

直接看完整建表语句,KEY和UNIQUE KEY就是索引定义,适合快速人工核对。

information_schema批量查

SELECT table_name, index_name, column_name, seq_in_index, non_unique
FROM information_schema.statistics
WHERE table_schema = 'mydb'
ORDER BY table_name, index_name, seq_in_index;

一次性导出整库所有表的索引结构,做索引巡检和冗余分析。

查某列是否被索引覆盖

SELECT DISTINCT index_name FROM information_schema.statistics
WHERE table_schema='mydb' AND table_name='users' AND column_name='phone';

判断phone列有没有索引,决定查询能否走索引。

注意事项

  • 联合索引顺序决定最左前缀,别只看有没有建;
  • Cardinality是估算值,会随ANALYZE TABLE刷新;
  • 前缀索引Sub_part只索引前N个字符;
  • 重复冗余索引用pt-duplicate-key-checker之类工具清理;
  • 索引不是越多越好,写多表要权衡插入成本;
  • 查完索引再配合EXPLAIN看实际是否命中。

总结

SHOW INDEX FROM表看索引明细,SHOW CREATE TABLE看定义,information_schema.statistics批量导出整库索引。重点关注索引名、列顺序、唯一性和基数,联合索引按最左前缀使用,建完索引务必用EXPLAIN验证是否真正命中,定期清理重复冗余索引,避免写放大。


emer 发布于  2026-10-20 07:06