MySQL执行路径
从图中能够看出基本步骤为:
1.客户端发送一条查询给服务器。
2.服务器先检查查询缓存,若是命中了缓存,则马上返回存储在缓存中的结果。不然进入下一阶段。
3。服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划
4。MySql根据优化器生成的执行计划,调用存储引擎的API执行查询。
5。返回结果给客户端。sql
MySQL客户端/服务器通讯协议
MySQL客户端和服务器之间的通讯协议是“半双工”的,这意味着,在任何野时刻,要么是由服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动做不能同时执行。因此,咱们没法也无须将也消息切成小块独立来发送。缓存
这种协议让MySQL通讯简单快速,可是也从不少地方限制了MySQL。一端开始发送消息,另外一端要接受完整个消息才能响应它。这就像来回抛球的游戏:在任什么时候刻,只有一我的能控制球,并且只有控球的人才能将球发回去。服务器
相反的,通常服务器响应给用户的数据一般不少,由多个数据包组成。当服务器开始响应客户端请求时,客户端必须完整地接受整个返回结果,而不能简单地只去前面这个结果,而后让服务器中止发送。这就是为何要加Limit并发
查询状态
对于一个MySQL链接,或者说一个线程,任什么时候刻都有一个状态,该状态表示了MySQL当前正在作什么,最简单是使用SHOW FULLPROCESSLIST命令。在一个查询的生命周期中,状态会变化不少次。MySQL官方手册对这些状态值的含义最权威的解释:
Sleep:线程等待客户端发送新的请求。
Query:线程正在执行查询或者正在将结果发送给客户端。
Locked:线程在等待表锁。等待行锁时不会出现。
Analyzing and statistics:线程正在收集存储引擎统计信息,并生成查询计划。
Sorting result:线程正在对结果排序。优化
查询缓存
在解析SQL语句以前,若是查询缓存是打开的,MySql会首先检查这个查询是否命中缓存中的数据。若是当前的查询刚好命中了查询缓存,那么在返回查询结果以前MySQL会检查一次用户权限,若是权限没问题就会返回,这种状况下查询不会被解析,不用生成执行计划,不会被执行。线程
查询优化处理
在查询缓存的下一步是解析SQL,预处理,优化SQL执行计划。这个过程当中任何错误均可能终止查询。blog
语法解析和预处理
首先MySQL经过关键字将SQL语句进行解析,并生成一颗对应的”解析树”。MySQL解析器将使用MySQL语法规则和解析查询。
预处理会根据MySQL规则进一步检查解析树是否合法。排序
查询优化
若是语法树是被认为是合法的,如今就会经过优化器转化为执行计划。
MysQL使用基于成本的优化器,它将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。
有不少缘由会致使MySQL优化器会选择错误执行计划。
1。统计信息不许确。
2。执行计划中的成本估算不等同于实际执行的成本。
3。MySQL的最优可能和你想的不同
4。MySQL不考虑其余并发执行的查询
MySQL能够支持的优化类型:
1。从新定义关联表的顺序
2。外链接转换为内链接
3。使用等价变换规则
4。优化COUNT(),MIN和MAX()——利用索引优化
5。预估转换为常数表达式
6。覆盖索引扫描
7。子查询优化
8。提早终止查询–LIMIT
9。等值传播
10。列表in()的比较–不是简单的or,将其排序并用二分查找的方式来肯定列表中的值是否知足、索引