简单说说mysql中一条读sql是如何执行的
在server层
会先【查询缓存】,
如果有,则直接返回
如果没有缓存,则会在分析器进行词法和语法的分析,如果存在语法错误,会在这一层进行报错
如果语法和词法都没有问题,则会在优化器进行优化,优化器主要是进行索引选择和多表关联的执行顺序选择。
在优化完成后,则走到执行器,执行器会先判断当前账号有没有表权限,如果没有,则会进行报错
如果有,则走存储引擎层进行查询。
在存储引擎层(已innodb为例,在RR隔离级别之下,同时认为是事务下的第一条查询)
如果是首次查询,会根据当前事务id生成一个read view
如果非首次查询,则会使用之前的一个read view
然后会根据当前的查询条件,选择的索引,以及选择的表关联顺序去查询数据
在查询到数据后,会根据read view 规则判断每一条数据是否可见
如果可见,则直接返回
如果不可见,会根据roll_pointer 去undo log 中查找其他版本的记录,
接着会将undo log 中的数据去对比read view 规则,直至查询到可见的数据
TIP:关于read view 请参考另一篇博文:简单说说mysql的mvcc-CSDN博客