优化数据访问
不要请求多余的数据
- 只查询需要的记录
- 只查询需要的列
- 不要重复查询相同数据
不要使MySQL扫描额外的记录
对于MySQL,最简单的衡量查询开销有三个指标
1. 响应时间
2. 扫描的行数
3. 返回的行数
响应时间
响应时间包括服务器时间和排队时间。服务器时间是指数据库处理这个查询真正花了多长时间。排队时间是指服务器因为等待某些资源而没有真正执行查询的时间。
一般最常见和重要的等待是I/O和锁等待,但实际情况更复杂
扫描的行数和返回的行数
理想情况下扫描的行数和返回的行数应该是相同的
扫描的行数的访问类型
访问类型从慢到快依次是 全表扫描、范围扫描、唯一索引查询、常数引用等。
一般MySQL能够使用下面三种方式应用WHERE条件,从好到坏依次为:
- 在索引中使用WHERE条件过滤不匹配记录。这是存储引擎层完成的
- 使用索引覆盖扫描来返回记录,直接从索引中过滤不需要的记录并返回命中结果。这是在MySQL服务器层完成的,但不雪再回表查询记录。
- 从数据表中返回数据,然后过滤不满足条件的记录。这在MySQL服务器层完成,MySQL需要先从数据表读出记录然后过滤。
重构查询
切分查询
- 分散服务器压力
- 减少锁的持有时间
- 减少MySQL复制的延迟
分解关联查询
- 让缓存的效率更高
- 分解后,执行单个查询可以减少锁的竞争
- 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展
- 查询本身效率也可能会有提升
- 可以减少冗余记录的查询
- 避免了MySQL的潜逃循环关联
查询执行的基础
执行路径