innodb下的mvcc_关于InnoDB中mvcc和覆盖索引查询的困惑?

来天坑了,坑人呀,报错之后表格没了

首先我们来了解几个结构view的结构

下面解析一下每个字段的含义:

low_limit_no:

low_limit_id:trx->id >=low_limit_id的事务,当前view不可见

up_limit_id:trx->id

n_trx_ids:

trx_ids:系统中所有活跃事务id列表

view_list:view列表聚集索引行结构

二级索引记录结构

在二级索引页面中,有DB_MAX_ID:标识修改索引页面的最大事务ID2)插入和更新时候的操作

初始情况

–create table and index

create table test (id int , comment char(50), primary key(id), key test(comment)) engine=InnoDB;

–Insert

insert into test values(1, ‘aaa’);

insert into test values(2, ‘bbb’);

1.执行如下两个sql

update test set id = 9 where id = 1;

update test set comment =

‘ccc’ where id = 9;

索引结构变为如下:

1.更新主键,聚簇索引/二级索引均无法进行in place update,均会产生两个版本;

2.更新非主键索引,聚簇索引可以in place

update;二级索引产生两个版本;

3.聚簇索引记录undo,二级索引不记录undo;

4.更新聚簇索引,记录旧版本会进入rollback

segment undo page

5.更新二级索引,同时需要判断是否修改索引页面的MAX_TRX_ID

6.属于同一事务的undo记录,在undo page中保存逆向指针3)查询(查询主键索引、二级索引)

3.1 查询主键索引

select

* from test where id = 1;

查询的结果和当前查询所属的read view 的值有关系,read view值不同,产生的结果也不同

对于read view0,db_trx_id(1811) < view.up_limit_id,则当前记录对view可见,即该记录删除可见,查询结果为空

对于read view1, db_trx_id(1811) >

view.low_limit_id, 则当前记录对view不可见,根据db_roll_ptr回溯历史记录,trx_id=1809,对1809在view中判断可见性,1809通过up_limit)id和low_limit_id不能够判断可见性,则在trx_ids[]中查询,发现不在trx_ids中,则该记录可见,返回(1,aaa)

对于read

view2, db_trx_id(1811)通过up_limit)id和low_limit_id不能够判断可见性,则在trx_ids[]中查询,发现在trx_ids中,则该记录不可见,返回结果为空

总结:通过主键查找记录,需要配合read_view,记录DATA_TRX_ID,记录DATA_ROLL_PTR指针共同判断。

read_view用于判断当前记录是否可见(判断DATA_TRX_ID)。DATA_ROLL_PTR用于将当前记录回滚到前一版本。3.2 查询二级索引

select

* from test where comment = 'aaa';

查询的结果和当前查询所属的read view 的值有关系,read view值不同,产生的结果也不同,此时二级索引中的MAX_TRX_ID派上了用场

对于read view0,

MAX_TRX_ID(1816)

对于read view2, MAX_TRX_ID(1816)根据up_limit_id和low_limit_id不能判断

其可见性,则依次遍历每一条记录来判断可见性,对于第一条记录

,反查到聚簇索引记录

,对该调记录判断其可见性,1811通过low_limit_id和up_limit_id判断不了,且不在trx_ids中,则该条记录可见,即aaa已经删除,

对于第二条记录

,反查到聚簇索引记录

,对该调记录判断其可见性,1816通过low_limit_id和up_limit_id判断不了,且在trx_ids中,则该条记录不可见,通过db_roll_ptr进行判断,1811通过low_limit_id和up_limit_id判断不了,且不在trx_ids中,则该条记录可见,返回(9,aaa),

对于第三条记录

,反查到聚簇索引记录

,对该调记录判断其可见性,1816通过low_limit_id和up_limit_id判断不了,且在trx_ids中,则该条记录不可见,通过db_roll_ptr进行判断,1811通过low_limit_id和up_limit_id判断不了,且不在trx_ids中,则该条记录可见,值为aaa,同时发现该值aaa和二级索引中的值ccc不相同,则该条记录不返回

综上所述最后返回(9,aaa)

总结:

1.二级索引的可见性判断需要通过聚簇索引来完成;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值