尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间;如果把查询看做一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间,如果优化查询,
实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务执行的更快。
查询的生命周期大致可以按照顺序来分析,从客户端到服务器,后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端,其中‘执行’认为是整个生命周期中最要中的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据梳理,包括排序、分组等(了解查询的生命周期,清楚查询的时间消耗情况对于优化查询有很大多的意义)
查询需要在不同的地方花费时间,包括网络、CPU计算、生成统计信息和执行计划、锁等待(互斥等待)等操作,尤其是想底层存储引擎检索数据的调用操作,这些调用是在内存操作,CPU操作和内存不足时导致的i/o操作上消耗时间,根据存储引擎不同,可能还会产生大量 的上下文切换以及系统调用
查询性能低下最基本的原因是访问的数据过多,某些查询可能不可避免地需要筛选大量数据,大部分性能低下的查询都可以通过访问的数据量的方式进行优化
对于低效的查询,下面两个改善步骤分析总是有效的
1.1 是否向服务器请求了不需要的数据
有些查询会请求超过实际需要的数据,后这些多余的数据会被应用程序丢弃,这会给MySQL服务器带来额外的负担,增加网络开销,也会消耗应用服务器的CPU和内存资源
1.2 MySQL是否在扫描额外的记录
在确定查询只返回需要的数据以后,接下来应该看看查询为了返回结果是否扫描了过多的数据,对于MySQL,最简单衡量查询开销指标
- 响应时间
- 扫描的行数
- 返回的行数
响应时间
扫描的行数和返回的行数
扫描的行数和访问类型