MySQL各个组间的作用
MySQL分为Server层和存储引擎层两个部分,作用分别是:
- 连接、鉴权、词法和语法分析,优化在server层
- 存储和读写数据在引擎层
1、server层:
连接器:跟客户端建立连接,获取权限,维持和管理连接
分析器:知道了要做什么
- 词法分析:知道字符串,空格等代表什么
- 语法分析:根据语法规则,判断语法是否正确
优化器:知道了该怎么做
执行器:实际干活的
2、存储引擎
我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念。
物理上如何存储记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上
这都是存储引擎负责的事情。
一条查询语句是如何执行的?
概述
连接器
建立连接- 客户端发送一条查询语句给服务器
- (废弃)服务器先检查
查询缓存
, 如果命中了缓存, 则立刻返回存储在缓存中的结果。 否则进入正式的查询阶段 - 分析器进行
词法分析和语法分析
知道这是一条查询
语句。 - 优化器会用最好的方式去优化这条 SQL 语句,并生成一条条的
执行计划,
比如你创建了多个索引,MySQL 会依据成本最小原则
来选择使用对应的索引 执行器
首先校验权限,权限通过则根据优化器生成的执行计划, 调用存储引擎的API
来执行查询。将结果返回给客户端
图示
详述
-
建立连接
客户端进程与服务器进程TCP三次握手
建立连接,每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程
来专门处理与这个客户端的交互,直到该客户端退出时线程才会被销毁。 -
查询缓存
命中缓存返回缓存数据,未命中走正式查询 -
分析器:要做什么
分析器先会做词法分析
,识别出里面的字符串
分别是什么,代表什么。
然后做语法分析
。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。如果不满足则会报错,满足才会进入优化器。 -
优化器:该怎么做
MySQL的优化程序会对我们的语句做一些优化,如选择什么索引
等等。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。MySQL再依照这个执行计划和存储引擎进行交互. -
执行器:执行并返回结果
开始执行的时候,要先校验
一下你对这个表 T 有没有执行查询的权限
;
如果没有权限,就会返回没有权限的错误。
权限通过后。执行器打开表
(现在才打开表),调用存储引擎的API
来进行数据操作。
为什么废弃查询缓存?
因为查询缓存往往弊大于利。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空
。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。
一条SQL更新语句是如何执行的?
整体流程:
连接器
与客户端建立连接- 客户端发送一条
更新语句
给服务器 - 分析器进行词法分析和语法分析知道这是一条
更新
语句。 - 优化器会用最好的方式去优化这条更新语句,并生成一条条的
执行计划,
比如你创建了多个索引,MySQL 会依据成本最小原则
来选择使用对应的索引 执行器
首先校验权限,权限通过则根据优化器生成的执行计划, 调用存储引擎的API
来执行查询。找到这一行,然后更新
。最后将更新是否成功返回给客户端。