前言
我们觉得查询慢的时候就要开始考虑优化了,那么“慢”是怎么理解呢?当一个查询任务超过了我们能忍受的时间,就是“慢”了,我们就要考虑下优化。前面我们学习了索引优化、库表结构优化,下面我们一步步看查询优化。
查询生命周期
一个查询相当于服务端的一个任务,从开始到结束是一个完整生命周期。那么这个查询过程是什么呢?按照查询的先后顺序可以分为:从客户端请求–>到服务器–>服务器解析–>生成执行计划–>执行–>返回结果到客户端。而**其中的“执行”是最重要的阶段,包括了大量为了检索数据到数据引擎的调用以及调用后的数据处理,包括排序、分组等。**而了解了各个生命周期的职责,会帮助你理解为什么要这么优化一个查询。
查询执行的基础
先了解下MySQL是怎么优化和执行查询的,上图:
MySQL客户端/服务端通信
客户端和服务端通信是半双工的,要么是客户端在向服务端发送数据,要么是服务端在向客户端发送数据,不可能同时进行。也就意味着,一旦一段开始发送数据,另一端只能等到接收完成,才能进行响应。
查询缓存
查询优化处理
查询执行引擎
返回结果到客户端
查询为什么会慢
最基本的原因是访问数据太多,这里访问是服务端执行扫描的数据,区别于返会个客户端的数据。而访问数据过多,就要考虑两点:
1、是否向数据库请求了不需要的数据:
2、MySQL是否扫描了额外的数据: