Skip to content

SQL 语句的执行逻辑

B+树可以快速定位,来源于同一层兄弟节点的有序性。

  • 对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
  • 连接查询的两个表的字符集不同的话,对应的连接过程中要求再被动驱动表的索引字段上加上函数操作,最终会导致对驱动表做全表扫描。

幻读

幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。

  • 幻读在“当前读”下才会出现;
  • 幻读仅专指“新插入的行”。

解决方案:

产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。因此,为了解决幻读问题,InnoDB只好引入新的锁,也就是间隙锁(Gap Lock)。

image-20210429161932136

间隙锁和行锁合称next-key lock,每个next-key lock是前开后闭区间

间隙锁和 next-key lock 的引入,帮我们解决了幻读的问题,但同时也带来了一些“困扰”。