«
Mysql语句执行逻辑

时间:2022-3-2    作者:emer    分类:


Mysql基础知识
我们要了解mysql,那就从最常见的流程开始,我们在cilent端输入一条sql,究竟会经历哪些步骤? 可以思考30s …

一条SQL查询语句执行流程
select * from table where Id=4

要弄懂这条语句做的事情,我们先看下mysql整个架构涉及的

分为客户端,server端以及存储引擎,存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

首先要和server端建立连接,通过命令 mysql -hi p − P ip -Pip−Pport -u$user -p来进行三次握手,建立连接,建立好的连接可以通过命令 show processlist 来查看

分析器进行sql的词法和语法分析,如果表字段不存在,是在分析器阶段就提示 “Unknown column ‘k’ in ‘where clause’”,这个设计也是受oracle的影响

下一步是优化器,主要是进行索引的选择,以及执行方法逻辑的选择,比如你查询 select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 可以先根据t1条件查出数据,再根据t2过滤

确定好执行方式后,执行器会先判断是否有权限进行数据查询,如果有权限,则调用引擎的表接口进行查询

例如 select * from T where ID=10; 执行器的执行逻辑是这样的:

a. 调用innodb的引擎接口取这个表的第一行,判断ID的值是不是10,如果不是则跳过,如果是,那将数据存到结果集

b. 调用引擎接口查询下一行,重复相同的逻辑,直到最后一行数据

c. 执行器将结果集的数据返回给客户端

如果ID上面有索引,那么查询a执行的是查询符合条件的数据,在explain 执行语句的时候,rows_examined字段就代表查询的数据次数

一条SQL更新语句执行流程
update table set a=‘xxx’ where Id=4

更新语句前几个步骤和查询语句是一样的,分析器知道这是一条更新语句,优化器决定使用ID这个索引,执行器执行更新,更新流程还涉及重要的两个日志模块,redo log和bin log