ITPub博客

首页 > 数据库 > 数据库开发技术 > 知识点有点密集哦这个讨论,有课代表在,聊挺深~

知识点有点密集哦这个讨论,有课代表在,聊挺深~

原创 数据库开发技术 作者:丁奇3306 时间:2024-10-02 19:47:26 0 删除 编辑

A: 我想问下,比如查找a=1这样记录,在非叶子节点我们已经扫描到1这样记录,而且非叶子节点也有主键id,那他还有必要查到叶子节点去拿叶子节点的主键id再回表嘛?能不能直接通过非叶子节点的主键id去回表呢?
B: 不能,必须到叶子 
==问题1 和 回答1 ==

A:为啥一定要到叶子节点再回表
C:应该b+树的遍历对于二级非唯一索引和唯一索引聚簇索引都一样的吧。

非叶子节点遍历到的满足条件的a=1 也只是叶子节点中最小的值符合 对于多条符合a=1的值肯定需要继续访问叶子节点page的next记录 那非叶子节点的next记录不是a=1的值了。
所以都是根据查询的条件找到叶子节点的满足条件的起始值位置 然后在叶子节点的双向链表中遍历过滤数据。

B: 这个是合理解释之一👍我来补一个:叶子结点所在的page上的“最后更新的事务id”,是用来辅助判断数据可见性的。就是说在非叶子结点上看到的记录,可能是对当前语句不可见的,到叶子上才能判断。
==问题2 和 两个回答2.1 2.2 ==

D: 最后更新的事务id,非主键索引的页也有这玩意?
E: 必须有呀,不然覆盖索引就没法MVcc了
==问题3 对于2.2的追问==

D: 那非主键索引上有版本链么,如果两个事务,都用覆盖索引,其中一个事务update后还未提交事务了,另一个事务此时读的话,不得在版本链里往前找吗

E: 先用事务id判断是不是需要回表,需要回表的就回表,主键上才有回滚段,才能拿到历史版本,拿到之后再判断结果集里要不要返回,这种情况下,覆盖索引的优化其实没用上
==问题4  对于回答3的追问 ==


另一个系列:

入群加V:linxiaobin3306 感谢群里参与回答的 Zhu DR,Dong PL, Zhang GC, Wang ZJ.

推荐文章:《MySQL进阶单元课》前十单元大纲

原文作者:丁奇3306;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2024-08-07

  • 博文量
    104
  • 访问量
    44852