查询优化

来源:互联网 发布:三星软件商店下载 编辑:程序博客网 时间:2024/05/18 00:09

优化数据访问

不要请求多余的数据

  • 只查询需要的记录
  • 只查询需要的列
  • 不要重复查询相同数据

不要使MySQL扫描额外的记录

对于MySQL,最简单的衡量查询开销有三个指标
1. 响应时间
2. 扫描的行数
3. 返回的行数

响应时间

响应时间包括服务器时间和排队时间。服务器时间是指数据库处理这个查询真正花了多长时间。排队时间是指服务器因为等待某些资源而没有真正执行查询的时间。

一般最常见和重要的等待是I/O和锁等待,但实际情况更复杂

扫描的行数和返回的行数

理想情况下扫描的行数和返回的行数应该是相同的

扫描的行数的访问类型

访问类型从慢到快依次是 全表扫描、范围扫描、唯一索引查询、常数引用等。
一般MySQL能够使用下面三种方式应用WHERE条件,从好到坏依次为:
- 在索引中使用WHERE条件过滤不匹配记录。这是存储引擎层完成的
- 使用索引覆盖扫描来返回记录,直接从索引中过滤不需要的记录并返回命中结果。这是在MySQL服务器层完成的,但不雪再回表查询记录。
- 从数据表中返回数据,然后过滤不满足条件的记录。这在MySQL服务器层完成,MySQL需要先从数据表读出记录然后过滤。

重构查询

切分查询

  • 分散服务器压力
  • 减少锁的持有时间
  • 减少MySQL复制的延迟

分解关联查询

  • 让缓存的效率更高
  • 分解后,执行单个查询可以减少锁的竞争
  • 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展
  • 查询本身效率也可能会有提升
  • 可以减少冗余记录的查询
  • 避免了MySQL的潜逃循环关联

查询执行的基础


执行路径