# 深入理解MySQL 5.7执行计划:优化查询性能的关键

147 阅读3分钟

在数据库性能优化中,执行计划(Execution Plan)  是分析和调优SQL查询的核心工具。MySQL通过EXPLAIN命令提供执行计划的详细信息,帮助开发者理解查询的执行逻辑。本文基于MySQL 5.7官方文档,深入解析如何利用执行计划优化查询性能。


一、什么是执行计划?

执行计划是MySQL优化器对SQL查询语句的执行策略的解析结果。它描述了数据库如何访问表中的数据(如全表扫描、索引扫描)、表的连接顺序、是否使用临时表或排序操作等。通过分析执行计划,开发者可以快速发现潜在的性能瓶颈。


二、如何获取执行计划?

在MySQL中,使用EXPLAIN关键字即可获取执行计划:

EXPLAIN SELECT * FROM employees WHERE department_id = 5 AND salary > 8000;

对于更新/删除语句,MySQL 5.7支持EXPLAIN直接分析:

EXPLAIN UPDATE employees SET salary = 9000 WHERE id = 101;

输出示例:

+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table     | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+
| 1  | SIMPLE      | employees | ref  | department_id | key_dept| 5       | const | 3    | Using where |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+

三、解读EXPLAIN输出字段

1. id

查询的序列号。相同id表示同一执行层级,id值越大优先级越高(如子查询)。

2. select_type

查询类型,常见值:

  • SIMPLE:简单查询(无子查询或UNION)
  • PRIMARY:主查询(外层查询)
  • SUBQUERY:子查询
  • DERIVED:派生表(FROM子句中的子查询)

3. table

当前行操作的表名(或派生表别名)。

4. type

关键指标!  表示访问表数据的方式,性能从优到劣排序:

  • system > const > eq_ref > ref > range > index > ALL

    • const:通过主键或唯一索引查询(如WHERE id = 1
    • ref:非唯一索引查找
    • ALL:全表扫描(需警惕!)

5. possible_keys

可能使用的索引列表。

6. key

实际使用的索引。

7. rows

预估需要扫描的行数(越小越好)。

8. Extra

附加信息,例如:

  • Using index:覆盖索引(无需回表)
  • Using temporary:使用临时表(常见于GROUP BY)
  • Using filesort:额外排序操作(需优化)

四、案例分析:优化慢查询

场景描述

某查询在orders表中按user_idstatus筛选数据,执行缓慢:

SELECT * FROM orders 
WHERE user_id = 1001 AND status = 'shipped' 
ORDER BY create_time DESC;

原始执行计划

type: ALL  
key: NULL  
rows: 100000  
Extra: Using where; Using filesort

问题诊断:

  • type: ALL:全表扫描
  • filesort:未利用索引排序

优化步骤

  1. 添加复合索引

    ALTER TABLE orders ADD INDEX idx_user_status (user_id, status, create_time);
    
  2. 重新分析执行计划

    type: ref  
    key: idx_user_status  
    rows: 50  
    Extra: Using index condition; Backward index scan
    

优化效果:
扫描行数从10万降至50,且避免文件排序。


五、执行计划的局限性

  1. 估算值不精确rows为统计信息估算值,实际可能偏差。
  2. 不反映实际执行时间EXPLAIN不执行查询,无法显示锁等待或网络开销。
  3. 无法展示所有细节:如存储引擎内部优化、缓存命中情况。

六、最佳实践

  1. 对复杂查询始终先执行EXPLAIN
  2. 关注typerows字段,优先优化ALLindex类型。
  3. 利用覆盖索引(Extra: Using index)减少回表操作。
  4. 定期更新统计信息(ANALYZE TABLE),确保优化器决策准确。

结语

掌握执行计划分析是MySQL性能优化的必备技能。通过EXPLAIN的输出,开发者可以快速定位低效查询,针对性调整索引或SQL结构。尽管MySQL 5.7的执行计划工具已足够强大,但结合实际执行时间分析(如EXPLAIN ANALYZE需MySQL 8.0+)能获得更全面的优化视角。


进一步阅读: