Innodb drop index 流程小记

简介:
最近在做一个小特性,让InnoDB支持repair table来重建corrupted的索引,本文描述的是实现过程中遇到的一个小问题,主要和innodb drop index相关的一些随笔记录。

 

现象:针对损坏的page,加上一个标记位为corrupted,然而在删除索引并重建后,该标记未被清除掉,但是我在读取page时已经加了清理标记的操作(buf_page_init_low)。

 

drop index流程:
a. ha_innobase::prepare_inplace_alter_table
设置index->to_be_dropped = 1

 

b. ha_innobase::inplace_alter_table
不干活

 

c. ha_innobase::commit_inplace_alter_table

 

commit_try_norebuild
//row_merge_rename_index_to_drop : 将需要drop的index 在数据词典里rename成TEMP_INDEX_PREFIX前缀+index名

 

commit_cache_norebuild
//index->page = FIL_NULL
//row_merge_drop_indexes_dict:从数据词典SYS_INDEXES,SYS_FIELDS,中删除索引项相关记录。
/////row_merge_drop_indexes_dict—>que_eval_sql—>que_run_threads—>que_run_threads_low—>row_upd_step—>row_upd—>row_upd_clust_step—>dict_drop_index_tree   从系统表中删除记录,会触发释放索引树
/////////////btr_free_but_not_root—>fseg_free_step—>fseg_free_extent—>btr_search_drop_page_hash_when_freed  删除所有的AHI项
//dict_index_remove_from_cache:从cache中移除索引

 

alter_stats_norebuild
//dict_stats_drop_index: 从系统表mysql/innodb_index_stats中移除索引的物化的统计信息

 

如何处理二级索引在buffer pool中的page:
从代码逻辑来看,对drop掉的二级索引并没有做标脏驱逐处理,还是留在buffer pool中,也没有从Page hash中删除,仅仅释放自适应哈希记录。

 

如何重用:
由于被drop的索引段已经被设置为free,因此可以重用Page。然而buffer pool中的老索引的page可能并没有被驱逐掉,还存在于page hash中,这些block可以被重用,相关堆栈:
row_merge_build_indexes—>row_merge_insert_index_tuples—>btr_cur_pessimistic_insert—>btr_page_split_and_insert—>btr_page_alloc—>btr_page_alloc_low—>fseg_alloc_free_page_general—>fseg_alloc_free_page_low
—>fsp_page_create
     —>buf_page_create
     —>fsp_init_file_page   //重新初始化page,抛弃旧的内容

相关文章
|
3月前
|
存储 关系型数据库 MySQL
InnoDB and MyISAM Index Statistics Collection
存储引擎收集表统计信息,供优化器使用,关键数据为平均值组大小,反映相同键前缀值的行数均值。该值影响索引效率,值越大,索引查找行数越多,效用越低。MySQL通过调整`innodb_stats_method`和`myisam_status`系统变量控制统计方法,涉及NULL值处理,如nulls_equal将所有NULL视为同一值组,可能影响索引使用决策。通过设置变量可优化统计信息收集,提升查询性能。
|
6月前
|
缓存 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
108 3
|
7月前
|
存储 SQL 关系型数据库
Mysql专栏 - mysql、innodb存储引擎、binlog的工作流程
Mysql专栏 - mysql、innodb存储引擎、binlog的工作流程
147 0
|
SQL 缓存 NoSQL
InnoDB执行流程
数据库系统能够接受 SQL 语句,并返回数据查询的结果,或者对数据库中的数据进行修改,可以说几乎每个程序员都使用过它。所以,解析一下 MySQL 编译并执行 SQL 语句的过程,一方面能帮助你加深对数据库领域的编译技术的理解。另一方面,由于 SQL 是一种最成功的 DSL(特定领域语言),所以理解了 MySQL 编译器的内部运作机制,也能加深你对所有使用数据操作类 DSL 的理解,比如文档数据库的查询语言。另外,解读 SQL与它的运行时的关系,也有助于你在自己的领域成功地使用 DSL 技术。
118 0
InnoDB执行流程
|
存储 SQL 缓存
Mysql专栏 - mysql、innodb存储引擎、binlog的工作流程
这次新开了一个个人的mysql专栏,专门用于总结mysql的一些细节以及相关的案例总结,同时也包括了一些mysql的底层实现,在后续的篇章则是根据《mysql技术内幕innodb存储引擎》(第二版)来深入了解mysql中用的最多的存储引擎的内部细节。
125 0
|
存储 缓存 算法
InnoDB & index页-mysql详解(二)
InnoDB & index页-mysql详解(二)