[MySQL 学习] Innodb Optimistic Update流程

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:
更新一条聚集索引记录,接口函数是btr_cur_optimistic_update,这里的更新不涉及到标记删除/插入(二级索引更新或更新主键值,row_upd->row_upd_clust_rec_by_insert->btr_cur_del_mark_set_clust_rec->btr_rec_set_deleted_flag)
a.首先判断记录更新是否改变了大小或者需要外部存储,调用函数row_upd_changes_field_size_or_external

b.如果a返回的是false,则调用btr_cur_update_in_place进行in-place更新,然后返回, in-place更新的流程如下:
1.调用btr_cur_update_alloc_zip检查压缩page的mlog空间是否足够进行in-place 更新

(1)调用page_zip_available检查是否空间足够,如果有足够空间,直接返回TRUE

(2)当page_zip->m_nonempty为false时,直接返回FALSE,表明刚刚可能做过一次压缩,无需再进行下面的流程

(3)调用page_zip_compress进行压缩,如果压缩失败,返回FALSE

(4)再次调用page_zip_available检查压缩页的空闲空间

2.如果有足够的空间,则继续往下,调用btr_cur_upd_lock_and_undo检查锁并记录undo信息

(1)如果是非聚集索引,则直接调用lock_sec_rec_modify_check_and_lock,检查并对二级索引加锁,并更新该page的最大事务ID(page_update_max_trx_id), 然后从btr_cur_upd_lock_and_undo返回

(2)如果是聚集索引,调用lock_clust_rec_modify_check_and_lock检查记录锁

(3)调用trx_undo_report_row_operation记录undo

3.向记录中写入trx_id和roll_ptr信息(row_upd_rec_sys_fields)

4.对于聚集索引,如果当前block使用了adaptive hash index(block->index != NULL),则调用row_upd_changes_ord_field_binary//Checks if an update vector changes an ordering field of an index record,不是很明白,待分析,然后再调用btr_search_update_hash_on_delete从adaptive hash index中删除该记录

5.更新记录row_upd_rec_in_place
直接In-place更新记录,并调用page_zip_write_rec向压缩页的mlog中写入记录
//如果进行了多次In-place update,是否会产生多条mlog?? 这可能加大re-compress/re-orgnize的概率

6.对于非聚集索引的压缩page,更新insert buffer的空闲空间信息

    if (page_zip && !dict_index_is_clust(index)
        && page_is_leaf(buf_block_get_frame(block))) {
        /* Update the free bits in the insert buffer. */
        ibuf_update_free_bits_zip(block, mtr);
    }

7.写一条redo日志(btr_cur_update_in_place_log)

c.如果存在外部存储的列,则直接返回NULL,因为外部存储的更新当做pessimistic update来处理

d.将upd_struct中的记录更新到dtuple_t中,row_upd_index_replace_new_col_vals_index_pos

e.如果是压缩表,调用btr_cur_update_alloc_zip查看有没有空闲mlog空间,如果没有,则返回DB_OVERFLOW错误

f.新记录大于非压缩页空闲空间的一半,返回DB_OVERFLOW

g.更新后非压缩Page上的数据小于BTR_CUR_PAGE_COMPRESS_LIMIT,也就是8k时,返回DB_UNDERFLOW错误,表明该page太空了,随后上层逻辑会尝试将其中的数据转移到邻居节点

h.max_size=老的记录大小+Page重组织后最大插入记录大小,满足如下条件时,返回DB_OVERFLOW错误
    if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT)
           && (max_size >= new_rec_size))
          || (page_get_n_recs(page) <= 1))) 

i.调用btr_cur_upd_lock_and_undo检查锁并记录undo,不赘述

j.lock_rec_store_on_page_infimum(block, rec); //Stores on the page infimum record the explicit locks of another record
锁管理子系统不是很清楚,后面再系统分析

k.从adaptive hash index中删除记录 btr_search_update_hash_on_delete(cursor);

l.删除当前记录(page_cur_delete_rec)并移动page_cursor到前一个记录(page_cur_move_to_prev)

m.更新记录的roll_ptr及trx_id

n.如果空间足够的话,则插入记录btr_cur_insert_if_possible
1.插入记录page_cur_tuple_insert->page_cur_insert_rec_zip,前面已经描述过,不赘述
2.如果插入失败,调用btr_page_reorganize重新组织page,再调用page_cur_tuple_insert尝试插入一次

o.对于压缩表的非聚集索引leaf page,还需要更新insert buffer的free bits.(ibuf_update_free_bits_zip)

p.lock_rec_restore_from_page_infimum(block, rec, block); //Restore the old explicit lock state on the record

q.page_cur_move_to_next(page_cursor) and return DB_SUCCESS

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
29 7
|
11天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
62 7
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
142 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
18天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
49 9
|
13天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
87 15
|
6天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
13天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
17天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
25天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
1月前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
39 1

推荐镜像

更多
下一篇
DataWorks