MySQL 记录、页、索引的数据结构简析( 八 )

  • 最后将 dtuple_t* entry 转换成 byte , 用于写入文件 。
  • 插入流程的具体函数堆栈可以参考文章【InnoDB --insert 操作分析】 。
    插入流程可以简化为下图 。
    其中:
    • 首先进行数据行格式转换
    • 然后定位要插入的位置
    • 最后进行插入操作
    结论MySQL 中有行格式有三种存储方式 , 包括 Server 层的格式、索引元组格式(逻辑记录,tuple)、物理存储记录格式(record) 。
    类似的,数据页分为两种形式,包括物理页(block)、内存页(page) 。
    通过 B+ 树索引进行查找(lookup)是最为常见的操作,具体通过游标实现 。游标分为三种类型,包括 B-tree cursor、page cursor、persistent cursor 。
     
    存取数据时需要进行行格式的转换 , 原因是 IO 时使用二进制,内存操作时使用逻辑记录 。
    以插入数据为例,主要流程为:
    • 首先进行数据行格式转换
    • 然后定位要插入的位置,基于 cursor 实现
    • 最后进行插入操作
    其中数据格式的转换包括:
    • 首先从 byte 转换成 dtuple_t* row,其中保存完整的行数据;
    • 然后将 dtuple_t* row 转换成 dtuple_t* entry,其中保存每个索引的列数据;
    • 最后将 dtuple_t* entry 转换成 byte,用于写入文件 。
    数据格式转换过程中涉及较多数据结构,其中:
    • dtuple_t结构体中保存逻辑记录,也就是索引元组,其中包括dfield_t;
    • dfield_t结构体中保存字段信息,dfield_t::data中保存真实列数据的指针;
    • page_cur_t结构体中保存查询得到的记录 rec,其中包括buf_block_t;
    • buf_block_t结构体中保存数据页指针 frame,其中包括buf_page_t 。
    待办
    • row format
    • cursor
    • block
    参考教程
    • 《MySQL 内核 InnoDB 存储引擎》
    • 《MySQL 运维内参》
    • InnoDB --insert 操作分析
    https://zhuanlan.zhihu.com/p/103933731
    • InnoDB:B-tree index(1)
    https://zhuanlan.zhihu.com/p/164705538
    • InnoDB:B-tree index(2)
    https://zhuanlan.zhihu.com/p/164728032
    • InnoDB:Buffer Pool
    https://zhuanlan.zhihu.com/p/270343437
    • MySQL · 源码分析 · 一条insert语句的执行过程
    • MySQL · 内核分析 · InnoDB主键约束和唯一约束的实现分析
    http://mysql.taobao.org/monthly/2021/04/05/

    【MySQL 记录、页、索引的数据结构简析】


    推荐阅读