查询性能优化

优化数据访问

1、是否在查询中包含了大量的不需要的行

2、服务器是否在分析大量的不需要的行。

针对第一点我们要规避的一些操作:

  • 查询了100行 只显示10行。
  • 多表连接时返回全部列。
  • 使用select * from …。
  • 重复查询相同的数据。

针对第二点如何确保MySQL是否在扫描一些额外的记录,我们可以通过三个指标进行衡量:响应时间、扫描行数、返回的行数。这是哪个指标们记录到MySQL的慢查询日志中。

MySQL 执行计划的知识补充

我们主要查看两个字段的含义:

type:代表我们的查询使用了哪种类型的查询分别有:

system > const > eq_ref > ref > range > index > all。 此值一般要超过range,最好是达到ref是比较合格的一个查询。

Extra: 解析查询的额外信息

Using index:使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层完成的,但无须再回表查询记录。

Using where:从数据表中返回数据,然后过滤不满足条件的记录。这在MySQL服务器层完成,MySQL需要先从数据表中读出记录然后过滤。

发现查询需要扫描大量的数据但只返回少数行,可以尝试下面的技巧去优化它:

  • 使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无须回表获取对应行就可以返回结果了。
  • 改变库表结构。例如,使用单独的汇总表(这是我们在第6章中讨论的办法)。
  • 重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询