一条sql查询语句如何执行?

1)MySQL的逻辑框架图

一条sql查询语句如何执行?_第1张图片
Server 层:包括 连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如 存储过程、触发器、视图等。
存储引擎层:负责数据的存储和提取。其架构模式是插件式的, 支持InnoDB、MyISAM、Memory等多个存储引擎。常用的是InnoDB引擎。

2)连接器

第一步:先连上这个数据库,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接过程是经典的TCP握手。

3)查缓存

第二步:
MySQL拿到一个查询请求后, 会首先查询缓存,看看之前是不是执行过这条语句。之前执行过的语句及结果可能会以Key-Value的形式被存在内存中。 key是查询语句。
大多数情况下不建议查缓存,为什么呢 ?查询缓存的失效非常频繁,只要对一个表的更新,这表上的所有的查询都会被清空。对于更新压力大的表来说,查询缓存的命中率非常低。
可以用可以用 SQL_CACHE 显式指定查询缓存

mysql> select SQL_CACHE * from T where ID=10;

注意:在MySQL 8.0 已经直接去掉缓存功能。

4)分析器

第三步:
如果没有命中缓存, 就需要真正的执行语句。
分析器首先会做“词法分析”,解析出一条SQL字符串中分别是什么 ? 代表什么 ?
语法问题会在这一步做校验。

5)优化器

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

6)执行器

第五步:
上面步骤中分析了SQL,也优化了SQL,于是可以开始执行SQL了。
首先判断一下,账户是否有该表的查询权限;
然后调用InnoDB引擎接口取这表的第一行(如果有索引就是去满足条件的第一行);
再 调用引擎接口取“下一行”,重复相同逻辑, 直到取到这个表的最后一行;
最后 执行器将上述遍历满足条件额结果行组成的记录集作为结果集返回给客户端;

你可能感兴趣的:(mysql)