来天坑了,坑人呀,报错之后表格没了
首先我们来了解几个结构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.二级索引的可见性判断需要通过聚簇索引来完成;