IT科技资讯
联系我们
你的位置:主页 > IT科技资讯 > 正文IT科技资讯
Innodb:insert 第一次进行达观刺进逻辑(二级索引)
编辑:admin 发布时间:2018-11-05


水平有限,才能有限


实践在这之前记载是每行每行的凤凰娱乐平台刺进,而且是每行每个索引的刺进,这儿仅仅叙述的是某行关于某个二级索引的达观刺进流程,所谓达观就是不会引起索引树的结构更改,换而言之当时块有满足的空间进行刺进。

本文仅仅记载达观刺进的流程,和函数的进口,实践上许多咱们关怀的东西在哪里比方,这儿没有考虑紧缩页:

  • 重用空间只会查看del链表的第一个成员,因而块中或许存在碎片

  • 是否触发失望刺进是经过核算整个块的剩下空间和刺进记载的长度比较得出的成果,剩下空间包括了碎片空间

  • 关于刺进形象锁需求依据下一条记载是否上锁来判别是否需求加而且等候

  • 或许会触发锁承继

  • 仅有查看会或许触发LOCK_S也是这儿进入的

  • 刺进之前要定位数据

  • undo在redo生成之前生成

逻辑进口如下:

->row_ins_sec_index_entry_low 第一次进行达观刺进 mode=BTR_MODIFY_LEAF
  -> 是否是仅有键 是 row_ins_scan_sec_index_for_duplicate 进行仅有性查看
  -> 进行仅有性检测成果处理
  -> 进行数据查找 btr_cur_search_to_nth_level
     ->page_cur_search_with_match_bytes
  -> 假如仅仅查看重复值越过下面逻辑 if (dup_chk_only) 
  -> 进行达观刺进,假定不修正B+树结构 btr_cur_optimistic_insert,首要经过BTR_MODIFY_LEAF标明辨认,此处不考虑紧缩页
    ->核算转化逻辑记载(元组)为物理记载后的长度 rec_get_converted_size
      ->rec_get_converted_size_comp
    ->是否需求外部存储page_zip_rec_needAAAAt
    ->获取块的闲暇空间巨细 page_get_max_insert_size_after_reorganize 补白(1
    ->进行是否需求失望刺进的逻辑判别,首要仍是空间不行的状况 补白(2,假如需求失望刺进则这儿回来了
    ->假如是主键还需求预留部分空间 补白(3,假如没有预留空间也会进入失望刺进流程
    ->判别是否需求加锁和开undo btr_cur_ins_lock_and_undo,此函数还会回来是否需求做锁承继的处理为输出参数inherit
      ->查看是否需求加锁lock_rec_insert_check_and_lock 刺进形象锁就在这儿
      ->记载undo trx_undo_report_row_operation
      ->更改row undo ptr指针row_upd_index_entry_sys_field
    ->做实践刺进操作 page_cur_tuple_insert
      ->逻辑记载转化为物理记载 rec_convert_dtuple_to_rec
      ->获取每个字段的偏移量 rec_get_offsets
      ->进行实践刺进 page_cur_insert_rec_low
        ->获取记载的实践巨细
        ->寻觅适宜的方位进行刺进,本过程会找到适宜的方位回来给insert_buf
          ->获取free链表的头部记载,留意只会查看第一个记载,不会做遍历,因而块中碎片是极有或许呈现的
            仅仅innodb可以重组
          ->假如适宜则运用
          ->不适宜则回来
        ->进行记载创立仿制 memcpy方法仿制数据到insert_buf指向的方位,完结这一步记载参加到了块中 下面需求保护各种块信息  
        ->将记载参加到记载链表
        ->更新行的N_OWNER为0,以及设置heap_no
        ->设置块的一些最终修正特点如PAGE_DIRECTION、PAGE_N_DIRECTION、PAGE_LAST_INSERT
        ->更新slot的信息,或许触及更改owner记载信息和owner记载的N_OWNER信息
        ->写redo信息 page_cur_insert_rec_write_log
      ->回来刺进记载的offset
    ->进行AHI保护 btr_search_update_hash_on_insert/btr_search_update_hash_node_on_insert
    ->进行或许的锁的割裂 lock_update_insert 此处首要的判别是前面的输出参数inherit
    ->进行CHANGE BUFFER保护 ibuf_update_free_bits_if_full
  -> 假如成功修正最大事物ID PAGE_MAX_TRX_ID page_update_max_trx_id
  -> 回来成果
  • 补白1) 核算方法为
    空页的容量 = 页巨细(比方16K) - 页头巨细(120) - 页尾巨细(8) - 初始化2个槽巨细(4=2*2)
    实践的数据占用空间 = 现已分配数据空间的最大数据偏移量 - 页头巨细(120) - 现已删去且purge的空间包括碎片空间 + 槽巨细

然后用
空页的容量 - 实践的数据占用空间=实践可用空间

由于页中难免会呈现一些碎片,可是innodb的page具有重新组织的才能,可以开释这部分空间。其重组函数为btr_page_reorganize_low

  • 补白2) 逻辑包括
    假如包括碎片空间那么
    -- 假如可用空间缺乏或许可用空间现已少于了重组块的设置BTR_CUR_PAGE_REORGANIZE_LIMIT(UNIV_PAGE_SIZE / 32)
    -- 记载数量大于1
    -- 可用空间小于了刺进记载的巨细
    不然
    -- 可用空间小于了刺进记载的巨细

  • 补白3) 逻辑包括
    --叶子结点
    -- 主键
    -- 记载大于两行
    -- 剩下的空间 - 行的空间 < page_size/16
    -- 割裂主张主张割裂

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2218565/,如需转载,请注明出处,不然将追查法律责任。

本文源自: AG环亚国际官网

上一篇:dede获取任意栏目N级列表链接树形菜单
下一篇:没有了