SQL查询优化器通过规则优化和代价优化协同提升执行效率:规则优化基于语法结构应用启发式改写(如谓词下推、投影裁剪),代价优化依赖统计信息与成本模型选择最低开销物理计划,二者分层配合缩小搜索空间并精细比选。

SQL查询优化器通过规则优化和代价优化协同工作,提升执行效率。规则优化快速应用启发式经验,代价优化则依赖统计信息与成本模型做更精准选择。
规则优化:基于语法结构的快速改写
规则优化不依赖数据分布,而是依据预定义的等价变换规则重写查询树,目标是简化结构、提前过滤、消除冗余。常见规则包括:
- 谓词下推:把WHERE条件尽可能下推到扫描或连接节点,减少中间结果集大小
- 投影列裁剪:只保留最终需要的列,避免读取和传输无关字段
- 外连接转内连接:当外连接的ON条件与WHERE条件共同保证非空时,可安全转换
- 常量折叠:在编译期计算确定表达式(如
1 + 2 * 3),减少运行时开销 - 视图展开:将视图定义内联为子查询,使优化器能跨视图边界做整体优化
代价优化:基于统计信息的最优路径选择
代价优化在规则优化后的候选计划中,估算每个执行路径的I/O、CPU、内存和网络开销,选择总代价最低的物理执行计划。关键依赖包括:
- 表行数、列基数、数据倾斜度等统计信息(需定期
ANALYZE或UPDATE STATISTICS) - 索引存在性与选择性(如B+树深度、范围扫描预估行数)
- 连接算法代价模型(嵌套循环 vs 哈希连接 vs 归并连接,受内存与排序成本影响)
- 并行度配置与资源限制(如最大工作线程数、临时表空间大小)
规则与代价的协作关系
两者并非先后顺序,而是分层配合:规则优化缩小搜索空间,代价优化在精简后的空间中精细比选。例如:
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
- 先用“谓词下推”生成多个逻辑等价子计划,再对每个子计划估算不同连接顺序的成本
- 某些规则(如“索引适用性判断”)本身会调用代价估算,决定是否启用索引扫描而非全表扫描
- 数据库可能设置“优化级别”(如PostgreSQL的
optimizer_mode),控制规则应用深度与代价估算粒度
实际调优中的关注点
理解这两类优化有助于定位性能瓶颈:
- 若执行计划未使用已建索引,检查统计信息是否过期,或谓词是否导致索引失效(如对索引列使用函数)
- 若JOIN顺序明显不合理,确认连接列是否有准确的基数统计,或尝试用
JOIN ORDER HINT引导规则阶段 - 避免过度依赖规则优化——它无法替代良好的索引设计、分区策略或数据建模
- 代价模型是近似值,实际性能受缓存命中率、锁竞争、硬件IO能力等影响,需结合
EXPLAIN ANALYZE验证
规则提供方向,代价给出刻度;二者结合,才让SQL从“能运行”走向“高效运行”。









