简单说说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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值