SQL执行计划是数据库引擎执行SQL语句时的具体步骤描述,包含了表的访问方式、连接顺序、索引使用情况、数据过滤逻辑等关键信息,是排查SQL性能问题的核心工具。
执行计划的核心组成部分
不同数据库的执行计划展示形式略有差异,但核心组成部分基本一致,主要包括以下几个部分:
- 操作类型:表示当前步骤的执行操作,常见的有全表扫描、索引扫描、嵌套循环连接、哈希连接等
- 对象名称:当前操作涉及的表名、索引名等数据库对象
- 预估行数:数据库预估当前步骤会返回的数据行数
- 成本值:数据库评估当前步骤执行需要的资源消耗,通常包含CPU、IO等开销
- 执行顺序:步骤之间的先后执行关系,通常从内层向外层、从下往上执行
执行计划阅读的基础技巧
1. 优先关注高成本操作
执行计划中成本值越高的步骤,对整体性能的影响越大,应该优先分析这些步骤。如果高成本步骤是全表扫描,且表数据量较大,就需要考虑是否缺少合适的索引。
2. 核对预估行数与实际行数
如果执行计划中某一步的预估行数和实际返回行数差距过大,说明数据库的统计信息可能过期,需要及时更新统计信息,否则数据库可能会选择错误的执行路径。
3. 检查索引使用情况
索引是提升查询性能的关键,阅读执行计划时要确认查询条件是否用到了合适的索引。如果查询条件中的字段没有索引,很容易出现全表扫描的情况。
MySQL执行计划分析示例
以MySQL为例,使用EXPLAIN关键字可以查看SQL的执行计划,下面是一个简单的分析示例:
-- 创建测试表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50),
age INT,
create_time DATETIME,
INDEX idx_age (age)
);
-- 查看查询的执行计划
EXPLAIN SELECT * FROM user_info WHERE age = 20 AND user_name LIKE '张%';
上述SQL的执行计划输出中,我们需要重点关注以下几个字段:
| 字段名 | 含义 |
|---|---|
| type | 访问类型,range表示范围扫描,使用了idx_age索引 |
| key | 实际使用的索引,这里显示idx_age |
| rows | 预估扫描的行数,值越小性能越好 |
| Extra | 额外信息,Using index condition表示使用了索引下推优化 |
常见性能问题定位方法
通过执行计划可以快速定位以下几类常见的SQL性能问题:
- 全表扫描:type字段为ALL,且表数据量较大,需要添加合适的索引
- 索引失效:查询条件中对索引字段做了函数运算、类型转换,导致索引无法使用
- 连接顺序不合理:多表连接时小表没有作为驱动表,导致扫描行数过多
- 排序无索引:order by字段没有索引,出现Using filesort,需要添加排序索引
注意:执行计划中的成本和行数都是预估值,实际执行时可能会因为数据分布、统计信息准确性等因素出现偏差,分析时需要结合实际执行时间综合判断。
总结
分析SQL执行计划的核心是先理解执行计划的基本组成,再按照成本优先、核对行数、检查索引的顺序逐步排查。日常工作中可以多结合实际的慢查询案例练习,积累不同场景下的问题定位经验,就能快速掌握执行计划的阅读技巧,有效提升SQL优化效率。