mysql insert 源码_MySQL源码学习(四):从insert看btr

2023-10-19 17:30

本文主要是介绍mysql insert 源码_MySQL源码学习(四):从insert看btr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Btr: B+ Tree,是innodb的核心数据结构,它作为数据的索引,让数据库能够快速找到指定的数据。

B+ Tree的相关说明网上已经很多,本文通过insert操作的调用栈,来分析btr的操作过程。

·Btr操作在insert的哪个过程中被调用?

ac0925e43487cd09b2613c5282f5cd5a.png

图1 insert的函数调用栈(btr部分)

图1是一次insert操作打印的trace日志。大家可以看到第一行write_record函数,这个步骤是在mysql_insert函数中调用的。下面先调用innobase的write_row接口来执行pimary key的auto_increment操作,生成主键。然后再调用row_ins方法来向btr中插入数据。

本文要关注的流程主要在row_ins中的流程。

·row_ins

该函数在storage/innobase/row/row0ins.cc文件中,可以看出这是跟存储引擎相关的操作。

af5eb5f5d9e2c6a1bc5c0dfdfb26547a.png

图2 row_ins的主要流程

其中,Trace日志中打印了其中的3个流程,就包含在“插入index和数据”这个步骤中”:

row_ins_index_entry_step

|  row_ins_cluster_index_entry_low

|  |  btr_cur_search_to_nth_level

row_ins_index_entry_step:向表中插入一个索引

row_ins_cluster_index_entry_low: cluster_index这里是指聚簇索引,很熟悉的词吧。这里会插入一个聚簇索引,并且忽略外键的限制。如果发现主键已经存在(主键冲突),那么除非这条已经有的记录已经被事务标记为“已删除”,否则就会报主键冲突错误。

btr_cur_search_to_nth_level:  在btr上搜索指定的索引,并把cursor定位到指定的level。改函数支持两种模式,PAGE_CUR_LE和PAGE_CUR_GE。Insert使用PAGE_CUR_LE这种方式进行搜索。

·分配index

84a794f21f039b5b808013e00a9b5f70.png

图3 index的获取

row_ins函数第一部分,通过dict_table_get_first_index(node->table)来获取索引。Row_ins_get_row_from_select和row_ins_get_row_from_values分别对应了INSERT … SELECT语句和INSERT … values语句(包括多个values)。这两个函数中会把value值保存到node对象中。

·插入数据

1e4377e48aa758d6ea7d9bf415732537.png

图4 index和数据的插入

如图4所示,row_ins_index_entry_step方法是执行index插入的入口方法。返回如果成功,则说明插入成功。如果返回错误码是DB_DUPLICTE_KEY,则会判断是否包含了on duplicate update的语法,如果有的话,则会将索引保存到node->duplicate对象中,以便后面继续执行。如果没有包含on duplicate update的语法,则直接返回主键冲突的错误。

row_ins_index_entry_step中的三个主要流程上面已经介绍过。这里重点看row_ins_clust_index_entry_low函数中的流程:

bea701543bfbf7ea9ef4da8cd442c4ef.png

图5 获取btr中的cursor

btr_pcur_open方法,获取到这个新生成的index到底放到btr的哪个位置。这个位置,就由Cursor来标记标记。

bf7ee4f6496cd379650786741ef1985e.png

图6 btr_pcur_get_btr_cur宏定义

·pcur和cursor的关系

pcur是persistent cursor。因为btr是会分裂和变动的,当btr被分裂时,cursor的位置也会对应的进行变化。因此通过一层pcur的封装,将cursor的变化对外屏蔽,针对一个index,我们只需要通过一个固定的pcur去获取当前的cursor就可以了。

678eebed8355fbada23da252aa2eb892.png

图7 btr_pcur_t依赖于btr_cur

获取到了真实的cursor后,就可以拿到对应的leaf节点,就是具体的page。如图8所示,btr的leaf是page,而不是record,从这两个代码就可以证明。而插入的数据最终,是写入到rec_t中的。这里只是对page是否有记录做了初步的判断,记录的插入请看图9:。

2e6e930478cc52dc3a0b1a2f2e82f2c5.png

图8 通过cursor拿到page

请看图9中的btr_cur_optimistic_insert方法:

a2ce1b0622536d31fedd1e7e0f2023bc.png

图9 数据的插入

该方法会把记录写入到record中,同时如果需要重做btr,会着这里面进行调整。

0b39f9dc30f8b1634c88a4aecdc94f25.png

图10 插入流程

如图10所示,首先通过cursor拿到page,并记录下插入之间的record地址。通过page_cur_tuple_direct_insert方法插入记录后。再次通过相同cursor拿到record地址,并判断插入前和插入后的record地址是否相同。如果不同,说明btr发生了重构。这也证明了corsor指向的btr位置是在不断变化的。Corsor是在btr上的绝对位置,而这个位置上的数据会因为btr的重构而改变,因此外面加入了一层psersistent cursor,使得能够通过同一个index快速找到cursor。

这篇关于mysql insert 源码_MySQL源码学习(四):从insert看btr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/241279

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听