mysql中执行计划是数据库优化器为一条sql语句生成的预期执行方案,它描述了mysql将如何访问表、是否使用索引、表之间的连接顺序以及估算的扫描行数等信息。通过执行计划,我们可以提前知道一条查询大致会怎么跑,从而判断性能是否合理。

什么是mysql执行计划
当我们在mysql中发送一条select、update或delete语句时,优化器会先对sql进行解析,并基于统计信息和成本模型选择它认为代价最小的执行路径。这个路径的详细描述就是执行计划。它并不是真正执行sql,而是预估执行方式。
如何查看执行计划
最常用的方法是使用explain关键字放在sql语句前面。例如:
explain select user_id, user_name from t_user where age > 30 and status = 1;
执行后mysql会返回一张表,常见字段如下:
| 字段 | 含义 |
|---|---|
| id | 查询的标识符,相同id按顺序执行,不同id值越大越先执行 |
| type | 访问类型,如all全表扫描、ref索引查找、range范围扫描等 |
| key | 实际使用的索引名称,null表示未用索引 |
| rows | 预估需要扫描的行数 |
如何分析执行计划
分析时优先看type列,如果是all说明走了全表扫描,通常要考虑加索引。再看key列确认是否用到合适索引,最后结合rows判断数据量。比如下面的例子建立索引后观察变化:
-- 未建索引前查看 explain select * from t_order where user_id = 100; -- 创建索引 create index idx_user_id on t_order(user_id); -- 再次查看执行计划 explain select * from t_order where user_id = 100;
常见优化建议
- 避免在where条件中对字段使用函数,导致索引失效
- 联合索引注意最左前缀原则
- 用explain确认连接查询的驱动表是否合理
在代码中获取执行计划
sometimes我们需要在程序里分析慢查询,可以用如下方式调用:
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password='test', db='demo')
cur = conn.cursor()
cur.execute("explain select * from t_user where age > 20")
plan = cur.fetchall()
for row in plan:
print(row)
cur.close()
conn.close()
理解mysql中执行计划是什么,并养成用explain检查sql的习惯,能大幅减少线上慢查询问题。