mysql45讲第一章节

主要问题:select * from T where ID = 1;这行数据库查询语句在mysql数据库中的查询过程。

首先查看mysql数据库的整体架构

mysql45讲免费 mysql 45讲_数据库

MYSQL大致分为Server层和存储引擎层。

Server层包括连接器,查询缓存,分析器,优化器,执行器等,包括大多数核心服务功能,以及所有的内置函数,所有的跨存储器的功能在这一层实现,如触发器,视图等。

存储引擎层负责数据的存储和转发,架构模式是插件式,支持InnoDB,MyISAM,Memory等多个存储引擎,Innodb从mysql5.5.5版本开始成为默认的存储引擎。

连接器

命令:mysql -hmysql45讲免费 mysql 45讲_数据库_02port -u$user -p

如果用户名和密码不正确,收到“Access denied for user”的错误,然后客户端程序停止执行。

如果用户和密码正确,连接器去权限表里面查询你的权限,之后,这个连接里面的权限判断逻辑,就依赖此时读到的数据。

一个用户成功建立连接后,即使我们使用管理员账户对这个用户的权限进行修改,也不会影响已经存在连接的权限,修改完成后,只有新建的连接才会使用新的权限设置。

查询缓存

MySQL拿到一个查询请求后,会先到查询缓存看看,看看之前是否执行过这条语句,之前执行过的语句以key-value方式执行,被直接缓存在内存中,key是查询的语句,value是查询的结果。如果你的查询可以在这个缓存中找到key,那么value会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段,执行完成后,执行结果会被存入查询缓存中。MySQL8.0版本后彻底删除了这个功能了。

分析器

分析器首先做词法分析,输入的是多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么。会把select识别出来,这是一个查询语句,也会把“T”识别为“表名T”,把字符串“ID”识别成“列ID”。做完这些识别以后,就要做“语法分析”,根据词法分析的结果,语法分析器根据语法规则判断SQL语句是否满足MySQL语法。

如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。

优化器

经过了分析器,MySQL知道了需要做什么,但是在正式执行前,我们还需要优化器进行处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句里面有多表关联时,决定各个表的连接顺序。

例如:select * from t1 join t2 using(ID) where tl.c=10 and t2.d=20;

可以先从t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20.

也可以根据t2里面取出d=20的记录的ID值,在根据ID值关联到t1,在判断t1中c的值是否等于10.

这两种执行方法的逻辑是一样的,但是执行效率会有所不同,优化器的作用就是决定选择使用哪一个方案。

执行器

开始执行的时候,要先判断一下你对这个表T有无执行查询的权限,如果没有,就会返回没有权限的错误。

如果有权限,就打开表继续执行,打开表的时候,执行器根据表的引擎的定义,去使用这个引擎提供的接口。

比如我们这个例子中表T,ID字段没有索引,执行器的执行流程是这样的:

1.调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;

2.调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

3.执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果返回给客户端。

在数据的慢查询日志中可以看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。