MySQL的select流程( 二 )


对表上的更新 , 会让该表所有的缓存全部失效 。
大多数情况下不建议使用缓存 , 缓存的弊远远大于利 。MySQL8.0以后直接把查询缓存的功能进行了移除 。
分析器MySQL Server在拿到SQL语句以后 , 需要知道这条语句干什么 。
select id from test;

  1. 分析器做词法分析:需要把一长串字符串进行识别 , 比如上述语句需要将select识别出来 , 这是一个查询语句;test是表名 , id是列名
  2. 词法分析完成以后会做语法分析 , 语法分析器会根据语法规则判断该SQL语句是否合法
这里还会对查的列和表是否存在做校验(语义分析) 。
优化器在经过分析器以后 , MySQL Server已经知道想要干啥 , 但是怎么干 , 如何干才能更快 , 此时就需要借助优化器了 。
优化器会在有多个索引时决定使用哪个索引 , 或者有多表关联时决定各个表的连接顺序 。
执行器MySQL Server通过分析器知道要干啥 , 通过优化器知道怎么干 , 于是到达了执行器开始干 。
但是在开始干之前需要检查一下权限 , 如果权限校验不通过就会返回没有权限的错误 , 如下图:
MySQL的select流程

文章插图
 
如果权限校验通过 , 就打开表继续执行 。打开表会根据表的引擎定义去调用引擎提供的接口 。
select * from test where id = 1;假设上述表没有索引 , 引擎是InnoDB , 执行器会这样操作:
  1. 调用InnoDB引擎接口获取表的"第一行" , 判断ID是否为1 , 如果不是则跳过 , 是就将这一行存入结果集
  2. 调用引擎接口取"下一行" , 重复第一步的逻辑判断 , 直到取完表的"最后一行"
  3. 执行器将满足条件的行的结果集返回给客户端 。
执行器调用一次 , 引擎内部可能会扫描多行 。




推荐阅读