MySQL中的InnoDB一次select执行

学习MySQL 45讲后一些梳理。

MySQL中的InnoDB一次select执行_第1张图片

图中是 一次 select 的执行大致流程。

连接器:负责跟客户端连接,并且连接器会到权限表里面查出你拥有的权限。此后此连接的权限都依赖此次查询,即使修改以后也要重新连接才会生效。

缓存:SQL作为key的一个缓存,如果开启缓存,并且缓存中有数据(且判定有表的操作权限)则直接返回。DML(insert/update/delete)语句会使缓存失效。8.0中移除了缓存部分。

解析器:select column from table;

     1、词法解析:将字符串识别为对应结构, 如将字符串"cloume" 解析为 列 column,将字符串table解析为 表table。

     2、语法解析:检查输入语句是否符合SQL语法。

优化器:决定join顺序,选择索引。

执行器:判断有没有对表的操作权限,有权限则打开表根据表定义调用引擎接口。返回结果。

执行器是如何查找数据的?

如果没有索引 where column = ?

  1. 调用引擎接口取这个表的第一行,判断是否满足条件,不满足跳过,满足存在结果集中;

  2. 调用引擎接口取下一行,重复判断,直到取到这个表的最后一行。

  3. 执行器将上述遍历过程中所有满足条件的行组成的结果集返回给客户端。

如果有索引 where id = ?

  1. 调用引擎接口取这个表的满足条件第一行,存在结果集中;

  2. 调用引擎接口取满足条件的下一行,直到取到这个表的最后一行。

  3. 执行器将上述遍历过程中所有满足条件的行组成的结果集返回给客户端。

存储引擎又是如何读取数据的?

     数组是由索引组织的,MySQL中的索引结构是B+tree,非叶子节点存放key, 叶子节点存放数据。

MySQL中的InnoDB一次select执行_第2张图片

       白嫖别人的图。

       每一次读取数据并不是只读取单独一行数据,而是读取了整个叶子节点存放在buffer pool中删除空闲页,这一个叶子节点的数据作为干净页存储。

       buffer pool中的数据页使用LRU的内存淘汰策略。LRU LIST中又分为young区跟old区。

       第一次从磁盘读入内存的数据页,会先放在 old 区域。如果 1 秒之后这个数据页不再被访问了,就不会被移动到 LRU 链表头部。

    

你可能感兴趣的:(MySQL中的InnoDB一次select执行)