MySQL索引与Explain速查
相关概念:MySQL
排查 MySQL 查询性能时,最值得反复回看的通常不是某条“神奇 SQL”,而是索引规则和 EXPLAIN 的基本判断。
先抓入口
查看执行频次
SHOW GLOBAL STATUS LIKE 'Com_______';查看是否开启慢查询
SHOW VARIABLES LIKE 'slow_query_log';最常用的执行计划
EXPLAIN SELECT ...EXPLAIN 里优先看什么
type:性能层级最重要,越接近const/ref越好,all往往意味着全表扫描key:实际使用的索引rows:MySQL 预估要扫描的行数filtered:过滤比例,通常越高越好
索引设计的几个硬规则
- 联合索引尽量遵守最左前缀
- 常参与
where/order by/group by的列优先考虑索引 - 优先关注区分度高的列
- 多字段查询里,联合索引通常比堆很多单列索引更有效
- 索引不是越多越好,写入和维护成本都要算进去
常见索引失效场景
- 联合索引中间列被跳过
- 索引列上套函数
- 字符串比较时类型不匹配
- 左模糊查询
or两边只有一侧可用索引- 优化器判断走索引还不如全表扫
两个很实用的技巧
覆盖索引
如果查询字段都已经包含在索引里,可以避免回表。
前缀索引
对于长字符串列,可以只索引前缀:
CREATE INDEX idx_xxx ON tablename(columnname(10));它的核心取舍是:节省索引空间,但要关注区分度是否够用。
一个经验判断
调优时不要一上来就迷信“换写法”。先确认:
- 有没有合适索引
- 执行计划到底走了什么
- 查询慢是扫描太多,还是排序、回表、临时表太多