MySQL SQL执行流程

SQL执行流程

连接器

可以通过下边命令连接到 MySQL 服务中

mysql -h$ip -P$port -u$user -p$password

当连接成功后如不执行 SQL,连接会进入 Sleep 状态,可以通过 show processlist; 查询到当前所有连接

如果连接太长时间(由 wait_timeout 控制,单位为秒)没有执行任务,则会被断开连接,可以通过 show variables like 'wait_timeout'; 查看默认时间

当用户连接成功后,权限就确定下来。即使修改权限,仍然需要下次重新连接才能生效

查询缓存(Query Cache)

由于缓存效率不高,在 MySQL8 (MySQL官方说明)中已经被删除

Although MySQL Query Cache was meant to improve performance, it has serious scalability issues and it can easily become a severe bottleneck.

弃用缓存主要原因:

  1. 对表中数据的任何一个更新,都会导致与该表有关的所有缓存失效,如果数据修改比较频繁则会导致缓存性价比很低
  2. 查询必须 byte-for-byte 都相同,也就是相同的语句才会查询到缓存,Query Cache 不会对查询做任何解析优化

语法分析

语法分析阶段主要有两个任务:

  1. 解析语句,把传入的 SQL 语句生成对应的内部数据结构(解析树)
  2. 检查语句中的关键词,表,字段是否存在

优化器

当对应的 SQL 已经转化为解析树后,就需要通过优化器进行优化,尽可能减少扫描的行数。当优化器阶段执行后,整个语句的执行方案就已经确定下来

MySQL 优化器所做优化主要包括:

  1. 重写查询
  2. 决定表的读写顺序
  3. 选择合适的索引

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

首先会检查语句是否由执行权限,如果没有则会返回权限错误

存储引擎只负责存储数据,执行器通过获取存储引擎的一行一行数据,来确定最终查询结果

为什么权限检查要放到执行阶段呢?

有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段(过程中)才能确定。优化器阶段前是无能为力的

你可能感兴趣的:(mysql)