[MySQL 学习] Innodb Optimistic Delete 简述-阿里云开发者社区

开发者社区> zhaiwx_yinfeng> 正文

[MySQL 学习] Innodb Optimistic Delete 简述

简介:
+关注继续查看
接口函数是btr_cur_optimistic_delete
Innodb的Optimistic Delete操作主要是由purge线程来进行的,用户线程仅仅做了删除标记(包括删除记录,更新二级索引以及更新主键),

另外如果插入/更新操作回滚了,用户也会调用到函数btr_cur_optimistic_delete
例如回滚insert操作的调用栈为
trx_general_rollback_for_mysql–>…..->row_undo->row_undo_ins->row_undo_ins_remove_clust_rec->btr_cur_optimistic_delete

当我们正常删除记录时,一般仅仅是做一个标记,例如更新主键值的update函数栈
row_update_for_mysql->row_upd_step->row_upd->row_upd_clust_step->row_upd_clust_rec_by_insert->btr_cur_del_mark_set_clust_rec->btr_rec_set_deleted_flag

随后的purge线程调用栈为:
trx_purge->….->row_purge_step->row_purge->row_purge_del_mark->row_purge_remove_clust_if_poss->row_purge_remove_clust_if_poss_low->btr_cur_optimistic_delete

事实上btr_cur_optimistic_delete的流程也很简单,如果无需重组织btree(btr_cur_can_delete_without_compress),直接调用
a.lock_update_delete(block, rec);  //移除记录锁
b.btr_search_update_hash_on_delete(cursor)//更新adaptive hash index
c.page_cur_delete_rec删除记录
d.更新insett buffer 的free bits (压缩表调用ibuf_update_free_bits_zip,非压缩表调用ibuf_update_free_bits_low)

显然,在这里并没有对压缩页的mlog写入数据,实际上写入mlog是由用户线程执行的,对应函数为page_zip_rec_set_deleted.(;例如:row_upd->row_upd_clust_step->row_upd_del_mark_clust_rec->btr_cur_del_mark_set_clust_rec->page_zip_rec_set_deleted)
他的实现也很简单,只是将记录对应的slot设置一个删除标记位。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何理解并学习javascript中的面向对象(OOP)
本文不适合javascript初学者看(javascript水平还停留在函数级别的朋友,看了会觉得很晕的)。如果你想让你的javascript代码变得更加优美,性能更加卓越。
592 0
+关注
zhaiwx_yinfeng
MySQL内核开发者, 《高性能MySQL 第三版》译者之一,活跃于MySQL社区,BugList,etc...
224
文章
5
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载