如何通过MySQL检测索引是否合理避免冗余并提高查询覆盖率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1251个文字,预计阅读时间需要6分钟。
判断索引是否合理,第一步是查看它长什么样子。直接执行以下命令最快:
注意:CARDINALITY 是采样估算值,不一定准确;SEQ_IN_INDEX = 1 的列才是最左前缀起点;如果同一列多次出现在不同索引里且顺序一致,就埋下了冗余隐患。
常见误判点:
- 只看索引名(如
idx_user_id和idx_user_id_status)就认为后者“更全”,其实前者可能完全被后者覆盖 - 忽略
NON_UNIQUE字段——值为 0 表示唯一索引,影响查询优化器对等值查找的路径选择 - 没比对
COLLATION:若列为utf8mb4_0900_as_cs而索引排序规则是A,可能导致无法使用索引做范围扫描
用 EXPLAIN 验证查询是否真走索引、走了哪几列
EXPLAIN 不是“有没有用索引”的开关灯,而是告诉你优化器实际选了哪个索引、用了其中前几列、是否回表、是否用到索引排序。重点盯三个字段:key(实际使用的索引名)、key_len(用到的字节数)、Extra(比如 Using index 表示覆盖索引,Using filesort 表示丢了索引排序能力)。
本文共计1251个文字,预计阅读时间需要6分钟。
判断索引是否合理,第一步是查看它长什么样子。直接执行以下命令最快:
注意:CARDINALITY 是采样估算值,不一定准确;SEQ_IN_INDEX = 1 的列才是最左前缀起点;如果同一列多次出现在不同索引里且顺序一致,就埋下了冗余隐患。
常见误判点:
- 只看索引名(如
idx_user_id和idx_user_id_status)就认为后者“更全”,其实前者可能完全被后者覆盖 - 忽略
NON_UNIQUE字段——值为 0 表示唯一索引,影响查询优化器对等值查找的路径选择 - 没比对
COLLATION:若列为utf8mb4_0900_as_cs而索引排序规则是A,可能导致无法使用索引做范围扫描
用 EXPLAIN 验证查询是否真走索引、走了哪几列
EXPLAIN 不是“有没有用索引”的开关灯,而是告诉你优化器实际选了哪个索引、用了其中前几列、是否回表、是否用到索引排序。重点盯三个字段:key(实际使用的索引名)、key_len(用到的字节数)、Extra(比如 Using index 表示覆盖索引,Using filesort 表示丢了索引排序能力)。

