##查询性能优化
1. 为什么查询会慢
查询的生命周期:客户端-》服务器-》查询缓存-》命令解析-》预处理-》优化器优化-》查询执行引擎
查询生命周期每一子任务响应时间都可能慢,但核心是执行任务。
2. 慢查询基础:优化数据访问
分析步骤:
- 确认是否在检索大量超过需要的数据。(访问了太多行或列)
- 确认服务器是否在分析大量超过需要的数据行。
2.1 衡量查询开销三大指标:
- 1.响应时间:服务器时间和等待时间
- 2. 扫描的行数:访问类型
- 3. 返回的行数
访问类型:全表扫描-》索引扫描-》范围扫描-》唯一索引-》常数索引等。
三种方式额同意where条件,从好到坏依次:
- 1.在索引中使用where条件来过滤不匹配的记录。(引擎层完成)
- 2.使用索引覆盖扫描。(服务器层完成)
- 3.从数据表返回数据,然后过滤不满足条件的记录。(服务器层完成)
3. 重构查询方式
3.1 一个复杂查询还是多个简单查询
3.2 切分查询
3.3 分解关联查询
4. 查询执行的基础
查询的生命周期:客户端-》服务器-》查询缓存-》命令解析-》预处理-》优化器优化-》查询执行引擎
优化器优化能处理的优化类型:
- 1.重新定义关联表的顺序
- 2.将外连接转化为内连接
- 3.使用等价变换规则
- 4.优化count(),min(), max():索引和列是否可以为空可以帮助优化这类表达式
- 5.预估并转化为常数表达式
- 6.覆盖索引扫描
- 7.子查询优化
- 8.提前终止查询
- 9.等值传播
- 10.列表in()的比较
关联查询:也叫嵌套循环关联
5. 查询优化器提示(hint)
6. 优化特定类型的查询
6.1 优化count()查询
count()的作用:一、统计某个列的数量;二、统计行数。建议使用count(*) 意义清晰,性能也好。
6.2 优化关联查询
-
确保on或者using子句中的列有索引
-
确保任何的group by和order by中表达式只涉及到一个表中的列。
-
选择合适的驱动表。
6.3 优化子查询
6.4 优化group by和disctinct
1.通过索引优化
- 使用提示:sql_big_result和sql_small_result。
6.5 优化limit分页
6.6 优化union查询
1.尽量使用union all