Mysql 查询性能优化

  查询优化,索引优化,库表结构优化需要齐头并进,一个不能落。  

  为什么查询速度会慢

  在阐释编写快速的查询之前,需要清楚一点,真正重要的是响应时间。如果把查询看做是一个任务的话,那么它由一系列子任务构成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少任务的查询次数。通常来说,查询的生命周期大致可以按照顺序来看:冲客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以任务是整个生命周期的重要极端,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序和分组等。

 

  慢查询基础:优化数据访问

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

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

 

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

  1查询了不需要的记录

  2多表关联时返回了全部的列

 

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

  1在索引中使用WHERE 条件来过滤不匹配的理论,这是在存储引擎中完成的。

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

  3从数据表中返回数据,然后过滤不满足的距离(在Extra列中出现了Using where )。这在MySQL服务器层完成,MySQL首先需要从数据表读出记录,然后过滤。

 

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

  1使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无需回表获取对应行就可以返回结果了

  2改变库表结构。例如:单独使用汇总表。

  3重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询

  

  3总是取出全部的列(每次看到SELECT * 的时候都需要用怀疑的样审视,是不是真的需要返回全部的列。取出全部的列,优化器无法完成索引覆盖扫描这类优化,还肯能会为服务器带来额外的io,内存和cpu消耗)

  4重复查询相同的数据(最好的方法是,当初次查询的时候将这个数据缓存起来,需要的时候从缓存取出,这样做性能更好。)

posted @ 2015-11-27 23:17  郑彦秋  阅读(203)  评论(0编辑  收藏  举报