Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql查询优化器

MySql 查询优化器(Optimizer)解析

作者:猩火燎猿

MySQL查询优化器(Optimizer)是数据库内核中最核心的模块,它通过分析SQL语句、表统计信息和索引,生成最优的执行计划以提高查询效率,本文给大家介绍MySql 查询优化器(Optimizer)的相关知识,感兴趣的朋友跟随小编一起看看吧

一、查询优化器(Optimizer)简介

查询优化器是数据库内核中最复杂、最核心的模块之一。它的作用是根据解析器和预处理器生成的语法树,结合表的统计信息、索引、SQL语句结构等,生成一套最优的执行计划,以尽可能高效地完成查询。

查询优化器的主要目标是:用最少的资源、最快的速度获取正确的结果

二、查询优化器的主要任务

1. 逻辑优化

作用

过程

2. 物理优化

作用

过程

3. 执行计划生成

作用

过程

三、查询优化器的关键技术

1. 统计信息

2. 成本模型(Cost Model)

3. 索引选择

4. 连接顺序优化

5. 子查询与视图优化

四、优化器的执行流程

  1. 接收语法树
  2. 收集统计信息
  3. 枚举所有可能的执行计划
  4. 计算每种计划的成本
  5. 选择成本最低的计划
  6. 输出最终执行计划

五、EXPLAIN命令与执行计划

通过 EXPLAIN 可以查看优化器生成的执行计划。例如:

EXPLAIN SELECT name FROM users WHERE age > 25 ORDER BY name LIMIT 10;

输出(示例):

idselect_typetabletypepossible_keyskeyrowsExtra
1SIMPLEusersrangeage_idxage_idx500Using where; Using index; Using filesort

含义:

六、常见优化器相关问题

七、优化器的局限与补充

八、流程图

解析树
   ↓
收集统计信息
   ↓
枚举执行计划
   ↓
计算成本
   ↓
选择最优计划
   ↓
输出执行计划

九. 优化器的内部算法与决策流程

1 枚举所有可能的执行计划

优化器会根据 SQL 的结构,尝试多种执行路径。例如三表 JOIN,理论上有 6 种连接顺序,优化器会枚举这些顺序,结合不同的索引选择和连接算法,形成多种候选执行计划。

2 计算成本

每个执行计划都会被打分。成本模型会估算:

优化器会选出成本最低的执行计划。

3 选择连接算法

常见的连接算法有:

4 谓词下推与索引覆盖

谓词下推(Predicate Pushdown)是指将 WHERE 条件尽量提前到最底层的数据访问阶段,减少无效数据传递。
索引覆盖(Covering Index)指查询所需字段全部在索引中,无需访问数据页,极大提升性能。

十. 常见优化场景与实例

1 多表 JOIN 顺序优化

SELECT * FROM a JOIN b ON a.id = b.a_id JOIN c ON b.id = c.b_id WHERE a.status = 1;

2 子查询改写为 JOIN

SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

优化器会尝试将 IN 子查询改写为半连接或 JOIN,提高效率。

3 索引选择

SELECT * FROM users WHERE age > 30 AND city = 'Beijing';

十一. 优化器提示(Optimizer Hint)

有时优化器选择的执行计划并非我们期望的,可以用优化器提示强制指定计划:

示例:

SELECT * FROM users USE INDEX (idx_age) WHERE age > 30;
SELECT * FROM a STRAIGHT_JOIN b ON a.id = b.a_id;

十二. EXPLAIN 结果详细解读

EXPLAIN 是诊断 SQL 性能的核心工具。常见字段说明如下:

字段说明
id查询的标识符,复杂查询会有多个 id
select_type查询类型(SIMPLE、PRIMARY、SUBQUERY、DERIVED 等)
table当前访问的表名
type连接类型(ALL、index、range、ref、eq_ref、const、system)
possible_keys可能用到的索引
key实际用到的索引
key_len索引长度
ref连接条件引用的字段
rows估算扫描行数
filtered过滤后剩余行比例(MySQL 5.7+)
Extra额外信息(Using index, Using where, Using filesort, etc.)

示例解读:

十三. 与其他数据库优化器的对比

MySQL 优化器更适合中小型业务,大型复杂查询可能需要手动干预或SQL改写。

十四. 执行计划的生成与结构

优化器最终会输出一份执行计划,描述 SQL 查询的每一步操作。执行计划包括:

执行计划的结构通常是一个树状结构,每个节点代表一个操作(如表扫描、索引查找、JOIN、排序等),节点之间有父子关系,表示数据流动的顺序。

示例

假设有如下 SQL:

SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.age > 30 AND o.status = 'paid'
ORDER BY o.amount DESC
LIMIT 5;

优化器会考虑:

最终执行计划大致为:

TableScan(users) → Filter(age > 30) → NestedLoopJoin(orders, user_id) → Filter(status='paid') → Sort(amount DESC) → Limit(5)

十五. EXPLAIN 实践与分析

基本用法

EXPLAIN SELECT ...;

典型输出解读

idselect_typetabletypekeyrowsExtra
1SIMPLEusersrangeage_idx200Using where
1SIMPLEordersrefuser_idx500Using where; Using index; Using filesort

进阶技巧

十六. 优化器的局限与手动优化

局限性

手动优化手段

示例

SELECT /*+ USE_INDEX(users, age_idx) */ name FROM users WHERE age > 30;

十七. 优化器与存储引擎协作

十八. 性能调优建议

十九. 参考工具

二十、总结

查询优化器决定了SQL的执行效率,是数据库性能的核心。理解优化器的工作原理,有助于编写高效SQL、设计合理索引、诊断性能瓶颈。

到此这篇关于MySql 查询优化器(Optimizer)详解的文章就介绍到这了,更多相关mysql查询优化器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文