Disk内部结构——Cylinders, Row Reference Array, and the Master Index

这篇文章主要讲解的就是AMP中的内部组件,通过这篇文章你能够了解到以下几点内容。

  • 整体Disk结构图
  • Cylinder、Master Index、 Cylinder Index的概念和作用
  • Data Block数据块的组成部分
  • Row Reference Array通过二分搜索来快速定位数据的原理
  • 数据块分区后 TD系统如何快速定位数据
  • 不同温度的Cylinder
图1

整体Disk的结构图,编号由1-9的圆柱体就是Cylinder。Cylinder里面的矩形就代表DataBlock,下面我用一条完整的查询过程来贯穿这些组件,然后在下面会具体详细的介绍一下下面这句话中所涉及的关键词概念。

当一条查询带有主索引的查询语句发生时,PE会根据字段Hash成一个Hash value 然后到Hash bucket里面查找定位到的具体AMP。然后在具体的AMP中,根据Master Index 和 当前的目标表 定位到一个具体的Cylinder 然后根据Cylinder 中的Index去定位到具体的一个Datablock里面,然后根据你的Hash Value 也就是RowID的一部分,去Datablock的Row Reference Array里面利用二分搜索算法查找对应的Row的起始位置。找到之后根据Row length和Row的起始位置拿出这条查询结果。至此一条完整的查询结束。

需要注意的点,一个AMP只有一个Master Index 每一个Cylinder有自己的Index,所有一个AMP有多少个Cylinder就有多少个Cylinder Index。还有就是观察order_table这张表你会发现,它的数据分布在两个Cylinder中,并且一个Cylinder中也有两个DataBlock 因为当一张表的数据超过最大单个数据区的大小时(一般为1MB 具体根据整体系统大小会有不同的默认值) 数据区会分裂成多个。

图2

从图2我们可以看到Disk,Cylinder、DataBlock之间的层次关系。由大到小依次呈现包含关系。所以我们可以看到整个TD系统从最外层到最细粒度的一行数据,整体划分的非常仔细。通过这些复杂的设计去达成快速高效率的读写数据目标。

图3

图3就是一个DataBlock的内部组成图,由Header 、trailer、 RRA等构成。重点关注RRA,它利用二分搜索根据Hash value来定位具体的Row数据,这是非常高效的方法。通过起始位置和长度,就可以在一串毫无规则的二进制数据中获取指定内容。

图4

不同的Cylinder有自己的温度值,温度值的作用是用于标记一块数据的访问频率的高低,最经常使用的数据温度最高。反之则最低,TD系统能够很好的追踪数据的使用情况,来为不同的Cylinder去赋值。这样可以提高数据查询的效率,因为系统会把高温的部分数据放到高速硬盘中去。

推荐阅读更多精彩内容