跳到主内容

用EXPLAIN读懂MySQL执行计划 掌握type级别关键指标 ​

很多开发者在做SQL性能调优时,往往只会盲目新增索引,却不知道SQL实际执行时有没有用到索引、访问数据的效率到底处于什么水平。而MySQL自带的EXPLAIN命令,就是我们读懂SQL执行逻辑、定位性能瓶颈的最直接入口,其中type字段更是判断查询访问效率的核心指标。

快速上手EXPLAIN的基础用法 ​

要查看任意SQL的执行计划,只需要在查询语句前加上EXPLAIN关键字即可,我们可以先创建一张测试订单表,生成可复现的执行计划结果:

sql
-- 创建测试业务订单表,预置普通索引
CREATE TABLE `order_info` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL COMMENT '用户ID',
  `order_no` varchar(32) NOT NULL COMMENT '订单号',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `amount` decimal(10,2) NOT NULL COMMENT '订单金额',
  PRIMARY KEY (`id`),
  KEY `idx_userid` (`user_id`),
  KEY `idx_createtime` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 查看条件查询的执行计划
EXPLAIN SELECT * FROM order_info WHERE user_id = 1001 AND create_time > '2024-01-01';

执行后返回的结果包含id、select_type、type、key、rows、Extra等多个字段,其中type字段直接代表了MySQL找到目标数据行的访问方式,是我们判断查询性能的第一优先级参考指标。

核心指标type级别的优先级全解析 ​

type字段的取值从最差到最优有明确的优先级排序,不同取值对应的性能差距可能达到数百倍:

  1. ALL:全表扫描,MySQL会遍历整表的所有数据行匹配条件,千万级数据量下几乎一定会触发慢查询,是调优过程中必须优先消灭的级别。
  2. index:全索引扫描,和全表扫描的区别是遍历的是索引树的所有节点,而非数据行,性能略好于ALL,但仍然属于需要优化的低效率级别。
  3. range:范围扫描,利用索引限定查询的范围,只会扫描指定区间内的索引节点,常见于带>、<、in、between等范围条件的查询,属于可接受的中等效率级别。
  4. ref:非唯一索引等值查询,利用普通二级索引的等值条件匹配数据,会返回多个符合条件的数据行,是大部分业务场景下的最优常用级别。
  5. eq_ref:关联查询时使用主键或唯一索引做等值匹配,最多只会返回1条符合条件的数据行,常见于多表JOIN场景。
  6. const/system:最高效的访问级别,MySQL在查询优化阶段就能直接匹配到1条数据,把查询条件转化为常量,常见于根据主键查询单行数据的场景。 我们调优SQL的核心目标,就是尽可能把type级别从ALL、index这类低等级,往ref、range甚至更高的等级提升。

结合实战优化type级别的常见思路 ​

很多时候我们明明给字段加了索引,type级别却依然停留在ALL,大概率是踩了索引失效的坑:比如查询条件中对索引字段做了函数运算、字符串类型字段传入数值导致隐式类型转换、联合索引不满足最左匹配原则等,都会导致索引失效,最终触发全表扫描。 针对上文的测试查询,我们可以把user_id和create_time构建成联合索引,就能把原本的range级别进一步优化,减少回表次数:

sql
-- 新增联合索引优化查询效率
ALTER TABLE order_info ADD INDEX idx_user_createtime(user_id, create_time);
-- 再次查看执行计划,type会稳定维持在ref级别,扫描行数大幅降低
EXPLAIN SELECT * FROM order_info WHERE user_id = 1001 AND create_time > '2024-01-01';

日常调优时我们要养成习惯,遇到执行时间超过1秒的慢SQL,第一时间用EXPLAIN查看执行计划,重点校验type级别是否达标、key字段是否命中预期索引、rows字段的预估扫描行数是否在合理范围内,就能快速定位90%以上的SQL性能问题。 如果你手上有大量慢查询日志懒得逐行分析,可以直接使用本站提供的免费慢查询日志分析工具,一键解析日志中的慢SQL,自动生成EXPLAIN执行计划预览和优化建议,帮你快速定位数据库性能瓶颈,省去手动逐行排查的繁琐步骤。

免责声明

本工具与文章内容仅用于学习测试场景,优化建议仅供参考,请勿直接用于生产环境,由此产生的风险自行承担。