标签:技术 use 运行 返回 情况下 压力 线程池 实战 客户端程序
平时我们使用数据库,看到的通常都是一个整体, 例如下面:
mysql> select * from t where id=1;
我们看到的只是输入一条语句,返回一个结果,那么这条语句在MySQL内部的执行过程是如何的呢?
下面是mysql
的经典架构图
大致可以分为4层:
上面给出的是比较笼统的概念。接下来是根据mysql
实战45讲里第一讲的内容的一些总结。
下面这张mysql
逻辑架构图会更加清晰。
想要执行sql
语句的第一步就是需要选用一个客户端来连接上mysql
服务器, 这个客户端可以是各种语言,抑或是mysql
的原生端, 只要实现mysql
的基本通信协议即可。我们首先需要做的就是使用账号密码连接:
连接建立完成后, 可以选用相应的库, 执行select
语句。
mysql
拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。如果当前查询能够直接在这个缓存中找到,那么就会被直接将结果返回给客户端。
如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高, 和redis
缓存的原理如出一辙。
但是大多数情况下最好不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。 因此很可能费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
需要注意的是,MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。
如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL需要知道我们要做什么,因此需要对SQL语句做解析。
分析器先会做“词法分析”。我们输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么,然后去执行相应的命令。
例如我们输入select * from t where id = 1;
就会根据select
识别出是查询, from t
识别出是表t,如果我们输入有误,出现常见的语法错误,就会报You have an error in your SQL syntax
的错误, 需要在use near...
里找寻错误。
经过了分析器, mysql
知道了我们的目的,但在执行之前, 还需要进行过一步优化处理。
说白点就是优化客户端请求的 query语句
, 优化器是在表里面有多个索引的时候,会决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。 它会根据客户端请求的 query
语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果,优化器就相当于大脑,在这一步已经决定了接下来都该如何去执行的具体策略。
例如执行select uid,name from user where gender = 1;
首先这个select
查询会根据where
语句进行选取,而不是先将表全部查询出来以后再进行gender
过滤,接着这个select
查询先根据uid
和name
进行属性投影,而不是将属性全部取出以后再进行过滤。最后将这两个查询条件联接起来生成最终查询结果。
到了执行器,已经明确知道了该如何执行相应语句了。 开始执行的时候,要先判断一下该连接对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误(在工程实现上,如果命中查询缓存,会在查询缓存放回结果的时候,做权限验证。查询也会在优化器之前调用precheck验证权限)。
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
比如查询select * from t where id = 1;
假如在这个例子中, id字段没有索引,那么执行器的执行流程是这样的:
InnoDB
引擎接口取这个表的第一行,判断id值是不是10,如果不是则跳过,如果是则将这行存在结果集中;至此,这个语句就执行完成了。
对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。
上面就是一条mysql
中一条sql
语句的全部了.
标签:技术 use 运行 返回 情况下 压力 线程池 实战 客户端程序
原文地址:https://www.cnblogs.com/yscl/p/12042028.html