大体来说 数据库分为server层和引擎层
server层主要负责处理sql语句 包含很多 连接器 查询缓存 分析器 优化器执行器 选择索引触发器
数据库多个引擎公用server层 所以所有夸数据引擎的功能都在这一层 比如存储过程 触发器视图等..
引擎层是接口的处理 提供读写
1 连接器 : 校验账号密码是否错误 账户有那些权限
1.1 查询缓存: sql语句会用key:value 形式存储缓存当中 key是sql语句 value是值 如果存在则直接返回否则进入分析器(
不建议使用缓存如果条数过大每次更新sql语句那庞大的缓存也会更新一次 所以在8.0默认取消了缓存功能)
2 分析器
如果没有查到缓存则开始执行sql语言
分析器会先做 语法分析 会从你输入的一段字符串当中 判断出 select 是查询, T为表名, id是id等
如果你输入错误就会得到一个非常常见的语法错误提示
You have an error in your SQL syntax
这层也会判断你所需要的字段是否存在如果不存在在这层就直接返回 存在则进入优化器
3 优化器
优化器会选择合理的sql执行顺序 比如你jion AB A取出a.xx= 10 B取 b.xx=20 这时候他会分析 是先去A表里拿或者去B表里拿等等 索引选择 有没有可能选错也是在这一层 一切准备就绪进执行器
4 执行器
首先会判断 这个账户有没有这个表权限如果有则根据表的引擎去调用引擎提供的接口
没有则返回
假设现在是InnoDB innodb会调用接口判断第一行是不是为结果如果不是则继续调取直到查到结果或数据的最后一行返回数据(这也是我们在where 时候有时候查到为空的时候的原因, 也是为何会返回空数据) 最终返回给客户端