堆表&索引组织表

https://zhuanlan.zhihu.com/p/487271927
 
15 人赞同了该文章

很多大佬强调学习一定要看"原版英文材料"。

比如再google搜索堆表和索引组织表,可以看到很多中文加工的材料,比如下面:

实际你随便翻几篇,会发现由于作者的水平限制,整体都讲的云里雾里,导致用户看完更迷茫...(我觉得与其中文材料各种生拉硬扯, 为何不把原版材料翻译出来)。

我摘抄几个英文官网的材料来看,直观感受下官方文档的质量:

堆表结构

堆表的材料pg官方文档做的不错(阿里云polar-o也是堆表结构,图表也不错,适合墙内用户(橘黄色))比如:

堆表文件格式

pg

polar-o

堆表数据插入

pg

polar-o

堆表数据查找

索引组织表

索引组织表的材料Jeremy Cole关于innodb材料非常经典做的不错(git图标库)。

innodb的概念里,一切文件皆索引,下面直观体验下:

btree整体结构

btree由page组成,page对应文件中一个16kb片段

Page内部详情

page内部结构图形化展示

Page内部二级索引详情

上图中page内部单链表组成,并且key实际上不一定物理上有序。为了高效再page内进行查找,引入Page Directory Structure,大概4个record组成一个slot,page内record性能可以提升4倍,如下:

内存索引和文件的关系

上面是从内存或者逻辑角度看索引组织表,实际在用户进行CRUD操作时,会涉及到内存page树索引文件file的分配和回收等复杂逻辑,该逻辑可以通过下图来描述:

  1. tree -> 文件页面管理

  • 一个索引由一个root page节点来描述,启动时从ibdata的数据词典表中load元数据信息,其中SYS_INDEXES系统表中记录了表,索引及索引根页对应的page no(DICT_FLD__SYS_INDEXES__PAGE_NO),进而找到btree根page。找到根page后,通过其page header结构(见Page内部详情图左下角部分)PAGE_BTR_SEG_LEAF、PAGE_BTR_SEG_TOP两个字段可以定位出该索引的叶子和非叶子fseg;这样整个btree和fseg、extent、page的关系都建立起来了。

PAGE_BTR_SEG_TOP 和PAGE_BTR_SEG_LEAF结构

2. 文件空间分配 -> tree

上图中对于一个索引,会有两个fsegment段,每个对应下图标红的结构,再该索引crud的过程中,会通过其内部的FRAG_ARR来管理小数据量,通过FSET_xx来管理extent。

但是如果其FSET_FREE为空,此时就需要从全局FSP的FSP_XXX链表获取文件级别的extent空间,这部分由表头存储并通过FSP_HEADER来进行管理,见下图:

  • 关于inode page:
    • 由File Space Header的两个指针进行全局管理,每一项为一个inode类型的page 16KB。
    • 每个inode page包含85个inode entry,每个inode entry对应一个file segment;
    • 每个索引需要使用两个file segment,每个file segment对应32个琐碎page和extent链表,构成tree主体结构

索引文件布局

上面可以看到inode、file segment、extent、page等概念,其和文件物理布局之间的关系如下:

  • 物理文件整体上按照粒度分为三类:
    • page:文件切分基础单位,一个page 16KB
    • extent:为了避免page粒度太细导致tree查找随机io问题,连续的64个page 组成一个extent,1M空间
    • group: 文件角度的逻辑概念,对应512个extent,实际没有使用。
  • 关于表大小
    • page id为4字节,所以一个文件承载的page数为4G,容量为64TB(4GB * 16K)
  • 文件级别当前使用空间:
    • 通过File Space Header.Free Limit来描述当前文件有效初始化的边界。
  • fseg是从tree的角度引申出逻辑概念。用来管理extent。物理文件层面并没有fseg的概念,fset管理的大小可以为整个文件,最大64TB;fset和group都是逻辑概念,没有关系更没有一一对应的关系。

参考

pg表空间innodb表空间

表空间描述不错的材料innodb文件系统物理结构

[转帖]堆表&索引组织表的更多相关文章

  1. mysql之索引组织表

    1.二叉树/平衡树.B-tree.B+tree.B*tree 树:最上一层是根节点.最底下一层是叶子节点.(一般左边节点小于右边节点) 二叉树:每个节点最多只能有两个分支,一般只用于教材.二叉树的深度 ...

  2. 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)

    参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...

  3. 4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志

    跟踪标记:610 功能: 用批量导入操作(Bulk Import Operations)加载数据时,对于索引组织表(即有聚集索引的表) 最小化日志: 上图为simple/bulk-logged恢复模式 ...

  4. MySQL InnoDB 索引组织表 & 主键作用

    InnoDB 索引组织表 一.索引组织表定义 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT). 在Inno ...

  5. Oracle数据库 查看表是否是 索引组织表的方法

    1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...

  6. 【oracle11g,18】存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表

    一. 暂时表 暂时表放在暂时表空间,不生成redo,仅仅有undo. 在暂时表中能够创建索引.视图及触发器,还能够使用"Export and Import(导出和导入)"或&quo ...

  7. (转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁

    表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...

  8. MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)

    表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...

  9. MySQL表结构,表空间,段,区,页,MVCC

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

  10. MySQL表结构,表空间,段,区,页,MVCC ,undo 事务槽

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

随机推荐

  1. loader编写小记

    此项目在一些大佬的基础上进行了修改,或许能提供一些思路.还在学习中很菜很菜,不足之处还请师傅们多多指点 tips 对shellcode使用AES + Base85加密后以txt保存在远端供下载. 针对 ...

  2. Docker下的SqlServer发布订阅启用

    一.准备一个Docker的sqlserver #创建挂载数据文件夹 mkdir -p /home/mssql/data #创建挂载日志文件夹 mkdir /home/mssql/log #给文件夹权限 ...

  3. RocketMQ 的基本使用

    RocketMQwiki是一个分布式消息和流数据平台,具有低延迟.高性能.高可靠性.万亿级容量和灵活的可扩展性.RocketMQ是2012年阿里巴巴开源的第三代分布式消息中间件,2016年11月21日 ...

  4. Vue3中使用TypeScript封装axios遇到的问题(AxiosRequestConfig)

    如果您有更好的解决方法,欢迎评论区评论. 版本 "dependencies": { "axios": "^1.4.0", "van ...

  5. 记录:excel导入导出js-xlsx,处理合并

    效果 前情提要 后端传excel坐标数据,前端自己处理模板,找资料后,选择直接载入xlsx方式. 准备工作 npm i xlsx import * as XLSX from 'xlsx' 方法一:数据 ...

  6. Redis Sentinel 源码:Redis的高可用模型分析

    摘要:本文通过对Redis Sentinel源码的理解,详细说明Sentinel的代码实现方式. Redis Sentinel 是Redis提供的高可用模型解决方案.Sentinel可以自动监测一个或 ...

  7. 一文搞定Matplotlib 各个示例丨建议收藏

    摘要:Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,因为这样更直观,更方便发现训练中的 ...

  8. 华为云GaussDB:发挥生态优势,培养应用型DBA

    摘要:GaussDB首要的任务是解决华为的业务连续性的需求,同时也是要确保使用GaussDB的客户的业务能够连续,所以我们坚持战略投入,坚持从每一行代码,坚持从生态开始来构建整个数据库体系. 本文分享 ...

  9. vue2升级vue3: 全局变量挂载与类型声明

    全局变量挂载 vue2 Vue.prototype.$lm = {} vue3 const app = Vue.createApp({}) app.config.globalProperties.$l ...

  10. 字节跳动基于ClickHouse优化实践之“资源隔离”

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的 ClickHouse 有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量生产使 ...