【学习笔记】查询性能优化:优化数据访问

来源:互联网 发布:淘宝刷票会被发现吗 编辑:程序博客网 时间:2024/05/17 22:32

本文属于读书笔记,大部分内容摘抄于《高性能MYSQL》,摘抄内容版权属于原作者。

查询性能低下最基本的云因是访问的数据太多。某些查询可能不可避免地需要筛选大量数据,但这并不常见。大部分性能地下的查询都可以通过减少访问数据量的方式进行优化。对于低效的查询,我们通常发现通过下面两个步骤来分析总是有效的:

1. 确认应用成熟是否在检索大量超过需要的数据。这通常意味着访问了太多行,但有时候也可能是访问了太多列。

2. 确认mysql服务器层是否在分析大量超过需要的数据行。

是否向服务器请求了不需要的数据

有些查询会请求超过实际需要的数据,然后这些多余的数据会被应用程序丢弃。这会给mysql服务器带来额外的负担,并增加网络开销,另外也会消耗应用服务器的CPU和内存资源。有一些典型的情况如下:
  1. 查询不需要的记录
  2. 多表关联时返回全部列
  3. 总是去除全部列(用怀疑的眼光审视select *)
  4. 重复查询相同的数

MySQL是否在扫描额外的记录

在确定插叙那只返回需要的数据䙈,接下来应该看看查询为了返回结果是否扫描了过多的数据。对于mysql,最简单的衡量查询开销的三个指标如下:
  1. 响应时间
  2. 扫描行数
  3. 返回行数

响应时间
响应时间是两个部分之和:服务时间和排队时间。服务时间是指数据库处理这个查询真正花了多少时间。排队时间是指服务器应为等待某些资源而没有真正执行查询的时间——可能是等待I/O操作完成,也可能是等待行锁,等等。遗憾的是,我们无法把响应时间细分到上面这些部分,除非有什么办法能够逐个测量

扫描的行数和方茴的行数
分析查询时,查看该查询扫描的行数是非常有帮助的。这在一定程度上能够说明该查询找到需要数据的效率高不高。
理想情况下扫描的行数和返回的行数应该是相同的。但是实际情况中这种“美事”并不多。

扫描的行数和访问类型
在评估查询开销的时候,需要考虑一下从表中找到某一行数据的成本。mysql有好几种访问方式可以查找并返回一行结果。有些访问方式可以需要扫描很多行才能返回一行结果,也有些访问方式可以无需扫描就能返回结果。

在explain语句的type列反应了访问类型。访问类型有很多种,从权标扫描到索引扫描、范围扫描。唯一索引查询。常数引用等。这里列的这些,速度是从慢到快,扫描的行数也是从小到大。你不需要记住这些访问类型,但要明白扫描表、扫描索引、范围访问和单值访问的概念。

如果查询没有办法找到合适的访问类型,那么最好的解决方法通常就是增加一个合适的索引,这正是我们前一章讨论过的问题。索引让mysql以最高效,扫描行数最少的方式找到需要的记录。

一般mysql能够使用如下三种方式应用where条件,从好到坏依次为:
  1. 在索引中使用where条件来过滤不匹配的记录。这是在存储引擎完成的。
  2. 使用索引覆盖扫描(在Extra列中出现了useing index)来返回记录,直接从索引中过滤掉不需要的记录并返回命中结果。这是在mysql服务器层完成的,但无需再回表查询记录。
  3. 从数据表中返回数据,然后过滤不满足太哦啊见的记录(在extra列中出现using where)。这在mysql服务器层完成,mysql需要先从数据表读出记录然后过滤。

如果发现查询需要扫描大量的数据但只返回少数的行,那么通常可以尝试下面的技巧去优化它:
使用索引覆盖扫描,吧所有需要用到的列都放到索引中,这样存储引擎无需回表获取对应行就可以返回结果了。
该表库表结构。例如使用单独的汇总表。
从谢这个复杂的查询,让mysql优化器能够以更优化的方式执行这个查询。
0 0
原创粉丝点击