优化数据访问

来源:互联网 发布:普吉岛4日游 知乎 编辑:程序博客网 时间:2024/06/06 05:52

查询性能低下最常见的原因是访问的数据太多,除了那些不可避免地需要筛选大量数据的查询,大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。用下面两个步骤来分析低效的查询很有效:

  1. 确认应用程序是否在检索大量超过需要的数据。可能是访问了太多的行,也可能是访问了太多的列。
  2. 确认MySQL服务器是否在分析大量超过需要的数据行。

是否向数据库请求了不需要的数据

查询超过实际需要的数据,然后在应用程序内丢弃,这会给MySQL服务器带来额外的负担,并增加网络开销,消耗应用服务器的CPU和内存资源。下面是一些典型的操作:

  • 查询不需要的记录
  • 多表关联时返回全部列
  • 总是取出全部列
  • 重复查询相同的数据

MySQL是否在扫描额外的记录

确定你的查询语句只返回需要的数据后,接下来应该看看查询为了返回结果是否扫描了过多的数据。对于MySQL,最简单的衡量查询开销的有三个指标:

  1. 响应时间
  2. 扫描的行数
  3. 返回的行数

响应时间

响应时间是查询开销最重要的指标,由两部分组成:服务时间和排队时间。服务时间是指数据库处理这个查询真正花费的时间;排队时间是指服务器因为等待某些资源而没有真正执行查询的时间——可能是等待I/O和锁,实际情况更加复杂。
当你看到一个查询的响应时间,首先要看这个时间是否是一个合理的值,这个值是你估算查询的响应时间。了解这个查询需要哪些索引以及它的执行计划,然后计算大概需要多少顺序和随机I/O,在乘以一次I/O的消耗时间。最后把这些消耗都加起来,就可以获得一个大概的参考值来判断当前响应时间是不是一个合理的值。

扫描的行数和返回的行数

分析查询时,查看查询扫描的行数非常有帮助。理想情况下扫描的行数和返回的行数是1:1的,但在实际情况下,这种“美事”不多。在做一些关联查询时,服务器必须要扫描多行才能生成结果集中的一行,扫描的行数对返回的行数的比率通常很小,一般在1:1和10:1之间。

扫描的行数和访问类型

MySQL有好几种方式可以查找并返回一行结果。有些访问方式可能需要扫描很多行才能返回一行,也有些访问方式可能无须扫描就能返回结果。
用EXPLAIN中的type列可以看到查询的访问类型。访问类型有很多种,从慢到快依次是:全表扫描,索引扫描,范围扫描,唯一索引查询,常数引用等。如果查询没有找到合适的访问类型,那么解决的最好办法通常是增加一个合适的索引,索引让MySQL以最高效,扫描行数最少的方式找到需要的记录。

WHERE条件

一般MySQL能够使用如下三种方式应用WHERE条件,从快到慢依次为:

  1. 在索引中使用WHERE条件来过滤不匹配的记录。这只在存储引擎层完成的。
  2. 使用索引覆盖扫描来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层完成的,但无须再回表查询记录。
  3. 从数据表中返回数据,然后过滤不满足条件的记录。这是在MySQL服务器层完成的,需要先从数据表读出记录然后过滤。
原创粉丝点击