查询性能优化

##查询性能优化

1. 为什么查询会慢

查询的生命周期:客户端-》服务器-》查询缓存-》命令解析-》预处理-》优化器优化-》查询执行引擎

查询生命周期每一子任务响应时间都可能慢,但核心是执行任务。

2. 慢查询基础:优化数据访问

分析步骤:

  1. 确认是否在检索大量超过需要的数据。(访问了太多行或列)
  2. 确认服务器是否在分析大量超过需要的数据行。

2.1 衡量查询开销三大指标:

  1. 1.响应时间:服务器时间和等待时间
  2. 2. 扫描的行数:访问类型
  3. 3. 返回的行数

访问类型:全表扫描-》索引扫描-》范围扫描-》唯一索引-》常数索引等。

三种方式额同意where条件,从好到坏依次:

  1. 1.在索引中使用where条件来过滤不匹配的记录。(引擎层完成)
  2. 2.使用索引覆盖扫描。(服务器层完成)
  3. 3.从数据表返回数据,然后过滤不满足条件的记录。(服务器层完成)

3. 重构查询方式

3.1 一个复杂查询还是多个简单查询

3.2 切分查询

3.3 分解关联查询

4. 查询执行的基础

查询的生命周期:客户端-》服务器-》查询缓存-》命令解析-》预处理-》优化器优化-》查询执行引擎

优化器优化能处理的优化类型:

  1. 1.重新定义关联表的顺序
  2. 2.将外连接转化为内连接
  3. 3.使用等价变换规则
  4. 4.优化count(),min(), max():索引和列是否可以为空可以帮助优化这类表达式
  5. 5.预估并转化为常数表达式
  6. 6.覆盖索引扫描
  7. 7.子查询优化
  8. 8.提前终止查询
  9. 9.等值传播
  10. 10.列表in()的比较

关联查询:也叫嵌套循环关联

5. 查询优化器提示(hint)

6. 优化特定类型的查询

6.1 优化count()查询

count()的作用:一、统计某个列的数量;二、统计行数。建议使用count(*) 意义清晰,性能也好。

6.2 优化关联查询
  1. 确保on或者using子句中的列有索引

  2. 确保任何的group by和order by中表达式只涉及到一个表中的列。

  3. 选择合适的驱动表。

6.3 优化子查询
6.4 优化group by和disctinct

1.通过索引优化

  1. 使用提示:sql_big_result和sql_small_result。
6.5 优化limit分页
6.6 优化union查询

1.尽量使用union all

你可能感兴趣的:(mysql)