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验证是否真正命中,定期清理重复冗余索引,避免写放大。