文章插图
01. MySQL基础架构
SQL语句是如何执行的
学习一下mysql的基础架构,从一条sql语句是如何执行的来学习 。
一般我们写一条查询语句类似下面这样:
select user,password from mysql.user;这样就可以返回一个结果,但却不知这条语句的内部执行流程 。
如下是mysql的逻辑架构图:
文章插图
Mysql可以分为Server层和存储引擎层二部分 。
Server层有连接器/缓存/分析器/优化器/执行器,涵盖了mysql的很多核心功能 。
存储引擎层负责数据的存储和读取,支持Innodb,MyIsam,Memory,BlackHole等,Mysql5.5版本后默认的存储引擎是Innodb 。
接下来我们一层一层来看SQL语句的执行过程 。
1)连接器
首先客户端连接mysql时就是连接到了连接器上,连接器负责跟客户端建立连接/校验用户身份,获取权限 。连接命令一般如下:
【MySql基础架构以及SQL语句执行流程】mysql -h ip地址 -P 端口 -u 用户 -p当客户端输入完了用户名和密码开始连接时,连接器会校验:
- 如果用户名或者密码不正确,客户端会收到一个“Access denied for user”的错误 。
- 如果用户名和密码校验正确,连接器会检查用户所拥有的权限 。之后,这个连接里的权限逻辑判断,都依赖此时读到的权限 。
2)查询缓存
连接建立成功之后,你就能够执行select等语句了,这时就会进行第二步:查询缓存
Mysql收到一个sql请求之后,先检查缓存,看看之前是不是有执行过 。如果执行过并缓存没有过期,结果会以key-value的形式存储在内存中,key是查询语句,value是查询结果 。如果有缓存,直接把对应的value返回给客户端 。
如果语句不在查询缓存中,就会向下执行下面的阶段,执行完成后,会把结果放到缓存中 。
查询缓存的失效很平凡,因为只要更新一个表,那么这个表的所有查询缓存结果都会被清空,所以对经常变更的表,查询缓存的命中率很低 。除非这个表数据比较稳定,不经常改变,才适合查询缓存 。
了解下:Mysql8.0版本之后,查询缓存的功能就被删了 。
文章插图
3)分析器
如果没用命中缓存,分析器就开始工作了,对sql语句进行解析 。
首先分析器会做“词法分析”,你输入的多个字符加上空格组成的sql语句,分析器需要分析出来里面字符分别都代表什么 。
如从你输入的"select"关键字开始,mysql知道这是一个查询语句,然后分析出那个是表名,那个是你输入的条件等等 。
做完了词法分析,开始做“语法分析”,根据词法分析的结果,语法分析会判断你输入的这条sql语句是否符合Mysql语法 。
如果你的语句不对,就会收到“You have an error in you SQL syntax”的错误提醒,如果下面这个语句select少打了开头的字母“s” 。
mysql> elect * from stu;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from stu' at line 1一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接着“use near”后面的内容 。
4)优化器
经过了分析器,Mysql已经知道你要做什么了,在开始执行之前,还需要经过优化器的处理 。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联的时候,决定各个表的连接顺序 。
5)执行器
Mysql通过分析器知道了你要做什么,通过优化器知道了如何做,接下来就是执行器开始执行语句;
开始执行之前, 会先判断你对要操作的表或库有没有权限,如果没有就返回权限的错误 。
如果有权限,就打开表继续执行 。打开表的时候,执行器会根据表的引擎定义,去使用这个引擎提供的接口 。
比如这个select语句:select * from db1 where ID=100;
- 先调用Inodb引擎接口获取表的第一行,判断ID值是不是100,如果不是则跳过,如果是则将结果存在结果集中;
推荐阅读
- mysql命令行脚本
- mysql把查询的结果保存到表
- MySQL命令,一篇文章替你全部搞定
- mysql行列转换
- 架构选型之Nodejs与Java
- mysql查询条件字段值末尾有空格也能查到数据问题
- MySQL性能指标实时监控--awk命令实现
- 为什么会产生微服务架构,原来是这些原因
- MySQL连表Update修改数据
- MySQL数据库的SQL预处理技术,优化数据库必备