MySQL 系统学习 第四阶段:MySQL 高级 第二节:EXPLAIN 执行计划

📅 2026/7/14 5:26:25
MySQL 系统学习 第四阶段:MySQL 高级 第二节:EXPLAIN 执行计划
上一节我们学习了索引是什么以及索引为什么能提高查询速度。但是实际开发中会遇到一个问题CREATE INDEX idx_name ON user(name);创建了索引以后SELECT * FROM user WHERE nameTom;真的使用索引了吗为什么有时候明明有索引SQL 还是很慢这就需要学习EXPLAIN一、什么是 EXPLAIN定义EXPLAIN 是 MySQL 提供的 SQL 执行计划分析工具用来查看 MySQL 如何执行一条 SQL。简单理解你写 SQLSELECT * FROM user WHERE nameTom;MySQL 内部会决定方案A 扫描整张表 方案B 使用索引查询EXPLAIN 可以告诉我们MySQL 最终选择了哪个方案。二、基本使用语法EXPLAIN SQL语句;例如EXPLAIN SELECT * FROM user WHERE nameTom;返回字段含义id查询编号select_type查询类型table查询表type访问类型possible_keys可能使用的索引key实际使用的索引rows预计扫描行数Extra额外信息三、EXPLAIN 输出示例假设user 表100万数据有索引CREATE INDEX idx_name ON user(name);执行EXPLAIN SELECT * FROM user WHERE nameTom;结果字段值tableusertyperefpossible_keysidx_namekeyidx_namerows10说明MySQL✅ 找到了索引✅ 使用了索引✅ 只需要扫描10行四、重点字段解析1. type最重要⭐⭐⭐⭐⭐type 表示MySQL 访问数据的方式。性能从好到差system ↓ const ↓ eq_ref ↓ ref ↓ range ↓ index ↓ ALL① system最快。只有一条数据。例如系统表。② const主键查询。例如SELECT * FROM user WHERE id1;因为id 是主键。MySQL直接定位。③ eq_ref多表 JOIN 中常见。例如SELECT * FROM orders o JOIN user u ON o.user_idu.id;④ ref普通索引查询。例如WHERE usernameTom⑤ range范围查询。例如WHERE age BETWEEN 18 AND 30;使用索引范围扫描。⑥ ALL危险⭐⭐⭐⭐⭐表示全表扫描。例如SELECT * FROM user;或者索引失效。五、重点字段 key ⭐⭐⭐⭐⭐key表示实际使用的索引。例如结果key idx_name说明使用idx_name如果key NULL表示没有使用索引。六、possible_keys表示可能使用的索引。例如possible_keys: idx_name说明MySQL 认为这个索引可能有帮助。但是最终是否使用看 key。区别字段含义possible_keys可能使用key实际使用七、rows非常重要rows表示MySQL 预计需要扫描多少行。例如情况1rows 10很好。情况2rows 1000000说明扫描大量数据。SQL 可能需要优化。八、Extra 字段Extra 是非常重要的信息。1. Using index表示覆盖索引。例如索引(name, age)查询SELECT name,age FROM user;不用回表。很好。2. Using where表示使用 WHERE 过滤。正常。3. Using filesort ⭐⭐⭐⭐⭐危险。表示额外排序。例如ORDER BY create_time;但是没有索引。MySQL查询完数据后再排序。优化增加索引CREATE INDEX idx_time ON user(create_time);4. Using temporary ⭐⭐⭐⭐⭐危险。表示使用临时表。常见GROUP BY ORDER BY优化空间较大。九、判断 SQL 是否优秀一个好的 SQL通常type: const/ref/range key: 有值 rows: 较少 Extra: 没有 filesort 没有 temporary十、索引为什么存在但没有使用这是企业开发高频问题。① 使用函数索引name查询WHERE LOWER(name)tom索引失效。原因MySQL 需要计算后比较。② LIKE 前面使用 %例如WHERE name LIKE %Tom无法定位开头。索引失效。但是WHERE name LIKE Tom%可以使用索引。③ 类型转换字段phone VARCHAR(20)查询WHERE phone13800000000可能导致转换。④ 使用 OR例如WHERE nameTom OR age20;可能导致索引失效。十一、EXPLAIN 实际开发流程开发中发现 SQL 慢↓第一步EXPLAIN SQL;↓看type key rows Extra↓发现typeALL↓分析为什么没有索引↓优化增加索引 / 修改 SQL十二、本节总结字段作用type访问方式判断性能possible_keys可能使用索引key实际使用索引rows扫描数量Extra额外执行信息 本节核心一句话EXPLAIN 是 MySQL 性能分析的“诊断工具”它告诉我们 SQL 有没有走索引、扫描多少数据以及为什么慢。