使用mysql。首先要与他进行连接,连接层主要完成一些类似建立连接、授权认证、和相关的安全方案。输入密码就成功建立了连接,可以用 show processlist 查看所有数据库的连接状态
连接状态,一般是休眠(sleep),查询(query),连接(connect),如果一条 SQL 语句是query状态,而且time时间很长,说明存在问题
客户端太长时间没动静就会自动断开,时间由参数 wait_timeout 控制的,默认是八小时
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
连接数量也是有限的,最大连接数由参数 max_connections 控制
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
这一层架构完成了大部分的核心功能,包括查询解析、优化、缓存、还有所有的内置函数,所有的跨存储引擎的功能也都在这层实现,包括触发器、存储过程、视图等。
第一步的连接建立后,我们就可以执行 select 语句了。执行逻辑就会来到第二步:查询缓存。
MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。
8.0版本后就移除该功能了
解析器会做如下两件事情
1.词法分析,MySQL 会根据你输入的字符串识别出关键字出来,构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。
2.语法分析根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。
如果我们输入的SQL语句语法不对,就会在这里报错
经过了分析器,就知道你要做什么了,但在执行前还要进行优化处理,如重写查询、决定表的读取顺序、选择合适的索引等等。
比如你执行下面这样的语句,这个语句是执行两个表的join:
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;`
既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20。
也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10。
这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。
MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。
开始执行的时候,先判断你有没有对这个表查询的权限,没有就会返回没权限的错误。
有权限就打开表继续执行,打开表时,执行器会根据表的引擎定义,去使用引擎提供的接口。
select * from T where ID=10;如我们这个例子中的表T中,ID字段没有索引,那么执行器的执行流程是这样的:调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
至此,这个整个语句就执行完成了。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。
用于接收客户端发送的各种 SQL 命令,返回用户需要查询的结果,比如 DML、DDL、存储过程、视图、触发器这些
存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。
不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
数据存储层,主要是将数据存储在运行于该设备的文件系统之上,并完成与存储引擎的交互。
上一篇:C++ 10 类与对象(继承)
下一篇:《新场景样本挖掘和适应》