堆表&索引组织表

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. 一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库

    前言 今天给大家分享一个小巧.快速.轻量级的 .NET NoSQL 嵌入式数据库:LiteDB.本篇文章主要是介绍LiteDB和在.NET中如何使用. LiteDB介绍 LiteDB 是一个小巧.快速 ...

  2. C#数据结构与算法系列(十三):递归——迷宫问题

    1.示例 2.代码实现 public class Maze { public static void Test() { int[][] map = new int[8][]; for (int i = ...

  3. Spring Boot 整合 Log4j2 日志并压测性能

    1/ Log4j2的性能测试 从图中不难看出,在线程数为 2~16 之间,混合使用同步和异步的logger来打印日志,性能是最好的. 2/ 目标 混合 sync/async 彩色日志 分类输出到不同文 ...

  4. antd5中文设定

    antd5中文设定 import zhCN from "antd/lib/locale/zh_CN" <ConfigProvider locale={zhCN} theme= ...

  5. GaussDB拿下的安全认证CC EAL4+究竟有多难?

    摘要:近日,经过全球知名独立认证机构SGS Brightsight实验室的安全评估,华为云GaussDB企业级分布式数据库内核获得全球权威信息技术安全性评估标准CC EAL4+级别认证 本文分享自华为 ...

  6. ELT in ByteHouse 实践与展望

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 谈到数据仓库, 一定离不开使用Extract-Transform-Load (ETL)或 Extract-Load ...

  7. Mac Maven环境变量配置 zsh: command not found: mvn

    之前配过环境变量,但是后来打开还是报 zsh: command not found: mvn 需要在运行前先刷下环境变量 source ~/.bash_profile 每次使用前都刷一下比较麻烦,这是 ...

  8. Python FastAPI 获取 Neo4j 数据

    前提条件 先往Neo4j 里,准备数据 参考:https://www.cnblogs.com/vipsoft/p/17631347.html#创建传承人 搭建 FastAPI 项目:https://w ...

  9. Kubernetes(K8S) Service 介绍

    定义一组 Pod 的访问规则 存在的意义 防止 Pod 失联(服务发现),Pod 重启后,IP会变 定义一组 Pod 访问策略,负载均衡 Pod 和 Service 关系 根据 label 和 sel ...

  10. loguru python中记录日志

    loguru python中记录日志 安装 pip install loguru 使用 from loguru import logger # logger.add('ck/test_log.log' ...