深度解析|Apache Doris 索引机制解析

1 导言

Apache Doris 存储引擎选用相似 LSM 树的结构供给快速的数据写入支撑。进行数据导入时,数据会先写入 Tablet 对应的 MemTable 中,当 MemTable 写满之后,会将 MemTab二进制le 里的数据刷写(Flush)到磁盘,生成一个个不超过 256MB 的不可变的 Segment 文件。

MemTable 选用 SkipList 的数据结构,将数据暂时保存在内存中,SkipList 会按照 Key二分查找算法 对数据行进行排序,因而,刷写到磁盘上的 Segment 文件也是按 Key 排序的。Apache Doris 底层选用列存的方式来存储数据,每一列数据会被分为多个 Data Page。

为了提高数据读取功率,A索引查找算法pache Dor小米11ultrais 底层存储引擎供给了丰厚的索引类型,分别是前缀索引(Short Key Index)、Ordinal 索引、Zone Map索小米商城引、Bitmap小米换机 索引和 Bloom Filter 索引。前缀索引、Ordinal 索引和 Zone索引页是哪一页 Map 索引不需求用户干涉,会跟着数据写入主动生成;Bitmap 索引和 Bloom Filter 索引需求用户干涉,数据写入时默认不会生成这两种索引,用户能够有挑选地索引的作用为指定的列增加这两种索引。

数据从 MemTable 刷写到磁盘的进程分为两个索引失效的几种情况阶段,第一阶段是将 MemTable 中的行存结构在内存中转化为列存结构,并为每一列生成对应的索引结构;第二阶小米云段是将转化后的列存结构写入磁盘小米换机,生成 Segment 文件。

下面将分别对这些索引进行具体地介绍。

2 前缀索引(Short Key Index)

2.1 索引生成


前缀二进制八进制十进制十六进制转换索引是一种稀少索引。数二进制的运算规则据刷写进程中,每写入必定的数据行(默以为 1024 行)就会生成一条前缀索引项。前缀索引会对每一个索引距离的第一个数据行的前缀字段进行编码,前缀字段的编码与前索引超出了数组界限什么意思缀字段的值具有相同的排序规则,即前缀字段的值排序越靠前,对应的编码值排序也越靠前。Segment 文件是按 Key 排序的,因而,顺序查找算法前缀索引项也是按 Key 排序二进制怎么算的。

一个 Segment 文件中的前缀索引数据保存在一个独立的 Short Key Page 中,其间包括每一条前缀索引项的编码数据二进制、每一条前缀索引项的 offset、Short Key Page 的 footer 以及 Short Key Page 的 Checksum 信息。S索引hort Key Page 的 footer 中记载了 Page 的类型、前缀索引编码数据的巨细、前缀索引 offset 数据的巨细、前缀索引项的数目等信息。

Short Key Page 在 Segment 中的 offset 和巨细会被保存在Segment文件的footer中,以便于数据读取时能够正确地从Segment文件中加载出前缀索引数据。前缀索引的存储结构如图1所小米商城示。

深度解析|Apache Doris 索引机制解析

图1 前缀索引的存储结构

2.2 查询过滤


数据查询时,会翻开Segment文件,从footer中获取Short Key Page的off二分查找算法set以及巨细,然后从Segme算法是指什么nt文件中读取Short Key Page中的索引数据,并解分出每一条前缀索引算法是指什么项。

假如查询过滤条件包括前缀字段时,就能够运用前缀索引进行快速地行过滤。查询过滤条件会被划分红多个Key Range。对一个Key Range进行行过滤的办法如下:

(1)在整个顺序查找算法Segment的行规模内寻觅Key Range上界对应的行号upper r算法的空间复杂度是指owid(寻觅Segment中第一个大于小米手机Key Range上界的行)二进制

  • 对Key Range上界的前缀字段key进行编码。
  • 寻觅key或许存在的规模下界st二进制计算器art。依据编码寻觅前缀索引中第一个等于(存在前缀索引项与key的编码相同)或大于(不存在前缀索引项的与key的编码相同算法的特征)key编码的前缀索引项。假如找到满意条件的索引项,而且该索引项不是第一条前缀索引项,则将该索引项的前一顺序查找算法条前缀索引项对应的行索引超出矩阵维度号记载为start(前缀索引是稀少索引,第一个等于或大于索引页是哪一页Key Range上界key索引查找算法的数据行有或许在前一条前缀索引项对小米商城应的数据行之后);假如找到满意条件的索算法分析的目的是引项,而且该索引项是第一条前缀索引项,则记载该索引项对应的行小米8号为start。假如没有找到一条前缀索引项等于或大于key的编码,则记载最终一条前缀小米商城索引项对应的行号为start(第一个等于或大于key的行有或许在最终一条前缀索引项之后)。
  • 寻觅key或许存在的规模上小米11ultra界end。依据编码寻觅前缀索引中第一个大于key的二进制编码的索引项。假如找到满意条件的索引项,则记载该索引项对应的行号为end;假如没有找到一条前缀索引项大于key的编码,则记载Segment最终一行的行号为end。
  • 运用二分查找算法在start与end之间的行规模内寻觅第一个大于key的编码的行,行号记为upper rowid。

注:前缀索引是稀少索引,不能准确定位到key地点的行,只能粗粒度地定位出key或许存在的规模,二进制转换器然后运用二分查算法找算法准确地定位key的方位,如图2所示。

深度解析|Apache Doris 索引机制解析

图2 运用前缀索引定位row id的进程

(2)在0 ~ upper rowid规模内寻觅Key Range下界对应的行号lower rowid(寻觅Segment中第一个等于或大于Key Range下界的行)。

索引失效寻觅Key Range上界对应的row id的办法相同,不再赘述。

(3)获取Key Range的行规模。upper_rowid与lower_rowid之间的一切数据行都是当时查找算法有哪些Key Range需求扫描的行规模。

3 Ordinal 索快速查找算法

3.1算法导论索引生成


Apache Doris 底层选用列存的方算法的特征式来存储数据,每一列数据会被分为多个Data Page。

数据刷写时,会为每一个Data Page生成一条Ordi二进制计算器nal索引项,其间保存Data Page在Segment文件中的二进制offset、Data Page的巨细以及Data Page的开始行号,一切Data Page的Ordinal索引查找算法索引项会保存在一个Ordinal Index Page中, Ordinal Index Page在Segment文件中的offset以及Ordinal Inde索引失效的几种情况x Page的巨二进制八进制十进制十六进制转换细会被保存在Segment文件的footer中,以便于数据读取时能够经过两级索引找到Data Page(首要,经过Segment小米文件的footer找到Ordinal Index Pag索引超出矩阵维度e,然后,经过Ordinal Index Page中的索引项找到Data Page)。

Ordinal Index Page包括以下信息:一切Ord小米ina索引的优缺点l索引项二进制换成十进制算法数据、Ordinal顺序查找算法 Index Page的footer以及Short Key Page的Checksum信息。Ordinal Index Page的footer中包括当时Page的类型、Ordinal索引项数据的巨细、Ordinal索引项数目等信息。

假如列中只要一个Data Page时,即该列只要一条Ordinal索引项,则Segment文件中不需求保存该列的Ordinal索引数据,只需求将这二进制的运算规则仅有的Data Page在Segment文件中的offset以及该Data小米11 Page的巨细二进制八进制十进制十六进制转换保存在Segment文件的foo算法导论ter中。数据读取时能够经过Segment文件的footer直接找到这仅有的Data Page。索引的作用Ordinal索引的存储结构如图3所示。

Ordinal索引的作用是为了便利其他类小米云型的索引能够运用一致的方式查找Data Page,从而能够对其他类型的索引屏蔽Dat索引失效的几种情况a Page在Segment文件中的offset。

深度解析|Apache Doris 索引机制解析

图3 Ordinal索引的存储结构

3.2 查询过滤


数据查询时,会加载每一个列的Ordinal索引索引超出矩阵维度数据。经过Segment footer中记载的Ordinal索引的Meta信息判别当时列是否存在Ordinal Index Page,即判别当时列是否有多个Data Page。

假如当时列存在Ordinal Index Page,则从Segment footer中获取Ordinal Ind小米手机ex Page在Segment中索引图的offset和Ordinal Index Page的巨细,然后从Segment算法分析的目的是文件中读取Ordinal Index Page数据,并解分出每一条Ordinal索引项,即可经过Ordinal索引项获取当时列中每一个Data Page的开始行号、Da小米6ta Page在顺序查找算法Segment中的offset以及Data Page的巨快速查找算法细。

假如当时列不存在Ordinal Index Page,则能够直接从Segment footer中获取当时列中仅有的Data Page在Segment中的offset以及Data Page的巨细。

4Zone Map索引

Apache Doris 会为Segment文件中的一列数据增加Zone Map索引,同时会为列中的每一个D索引是什么意思ata Page增加Zone Map索引。Zone Map索引项索引的作用中记载了每一列或列中每一个Data Page的最大值查找算法有哪些(max value)、最小值(min value)、是否有n二进制的运算规则ull值(has null)以及是否有非null值(has not null)算法的信息。初始化时,max va二进制怎么算lue会被设置为当时列类型的最小值,min value会被设置为当时列类型的最大值,has null和二进制换成十进制算法has小米运动 not null会被设置为false。

4.1索引生成


数据刷写时,会给每一个Data Page创立一条Zone Map索引项。小米向Data Page中每增加一条数据,都会更新Data Page的Zone Map索引项。

假如增加的数据是null,则将Zone Map索引项的has null标志设置为true,不然,将Zone Map索引项的has no小米11t null标志设置为true。

假如增加的数据小于Zone Map索引项的min val小米6ue,则运用当时数据更新min二进制转八进制 value;假如增加的数据大于Zone Map索引项的max value,则运用当时数据更新max value。

当一个Data Page写满之后,会更新一次列的Zone Map索引项,假如Data P算法导论age索引项的min value小于列索引项的min value,则运用Data Page索引项的min val二进制转换器ue更新列索引项的min value;假如Data Page索引项的max value大于列索引项的max value,算法的特征则运用Data Page索引项的max value更新列索引项的max value;假如算法的有穷性是指Data Page索引项的has null标志为true二进制,则更新列索引项的has null标志为true;假如D索引图ata Page索引项的has not n索引超出矩阵维度ull标志为true,则更新列索引项的has not null标志为tru小米应用商店e。更新Zon顺序查找算法e Map索引的进程如算法的有穷性是指图4所示。

深度解析|Apache Doris 索引机制解析

图4 更新Zone Map索引的进程

列中每一个Data Page的Zone Map索引项会被序列化之后保存二进制转换器在Zone Map Index Page中。

Zone Ma索引p Index Page中包括以下信息:Zone Map索算法的空间复杂度是指引项数据、Zone Map Index Page的footer以及Zone Map Index Page的Checksum信息。

Zone Map I二进制怎么算ndex Page的footer中包括当时Page的类型、当时Page中Zone Map索引项数据的巨细、当时Page中Zone Map索引项数目以及当时Page中第一条索引项在整个列的Zone Map索引项中的序号等信息。

一个Zone Map Index Page写满之后,会创立新的Zone Map Index Page用于记载该列后续的Zone Map索二进制引项。

假如某一列有多个Zone Map Index Pa顺序查找算法ge,则该列的Zone Map索引会选用两级索引机制。第二级索引为多个的Zone Map Index P算法age,其间保存Data Pag二进制转换器e的Zone Map索引数据,每一个Zone Map Index Page会生成一条小米应用商店Ordinal索引项,一切Zone Ma算法的空间复杂度是指p Index Page的Ordinal索引项会被保存在一个Ordi二进制八进制十进制十六进制转换nal Index Page(留索引超出矩阵维度意,此处的Ord小米11ultrainal 索引与第3部分的Ord索引失效inal 索引不同,此处算法的时间复杂度取决于的Ordin算法是指什么a算法设计与分析l 索引指向Zone Map Index Page,而第3部分的Ordinal 索引指向Data Page)中作为一级索引。

每一个的Ordinal索引二进制项由k算法导论ey和value两索引图部分组成,key记载了当时Zone Map Index Page中第一条索引项在整个列的Zone Map索引项中的序号,value记载了当时Zone Map Index Page在Segment文件中的o二进制怎么算ffset和巨细。

Ordinal Index Page中包括以下信息:一切Zone Ma二进制怎么算p Index Page的Ord索引失效inal 索引数据、Ordinal Index Page的footer以及Ordinal Index Page的Checksum信息。Ordinal Inde顺序查找算法x Page的footer中包括当时Page的类型、当时Page中索引数据的巨细、当时Page中索小米8引项数目等。

一级索引Ordinal Index Page在Segment文件中的offset和巨细会被记载在Segmen索引t文件的footer中。假如某一列只要一个Zon二进制e Map Index Page,则不需求两级索引,这个仅有的Zone Map Index Page在Block中的offset和巨细会被记载在Segment文件的footer中。Zone Map索二进制转化为十进制引的存储结构如图5所示。

深度解析|Apache Doris 索引机制解析

图5 Zone M小米商城ap索引的存储结构

4.二进制换成十进制算法2 查询过滤


数据查询时,会加载每一个列的Zone Map索引数据,并解分出每一个Data Page的Zone Map索引数据。

经过Segment footer中记载的Zone Map索引的Meta信息判别当时列的Zone M二进制转八进制ap是否含有两级索引。

假如含有两级索引,则S二进制egment footer中记载了一级索引Ordinal Index Page在Segment文件中小米商城的offset和巨细,加载一级索引Ordinal Index Page,并解分出每一个的Or快速查找算法dinal索引项的key和value,key记载了每一个Zone Map Index Page中第一条索引项在整个列一切的Zone Map索引项中的序号,value记载了每一个Zone Map Index Page在Segment文件中的offset和巨细。

不然,当时列的Zone Map索引只含有一个Zone Map Index Page,Segment footer中记载了该Z小米one Map Index Page在Segment文件中的offset和巨细。能顺序查找算法够经过Zone Map Index Page解分出每一个Data Page的Zone小米手机 Ma查找算法有哪些p索引数据,其间包括最大值(max v查找算法有哪些alue)、最小值(min valu小米8e)、是否有null值(has null)以二进制换成十进制算法及是否有非null值(has not null)的信息。

运用Zone Map对Data Page进行过滤的办法如下:

  • 过滤条件的运算符不是IS。假如Zone Map索引的has null为true(Data Page中含有NULL值),则Data Page不能被过滤二进制转化为十进制掉。
  • 过滤条件为field = value。假如 value在Zone Map索算法的有穷性是指引的最大值与最小值之间,则Data Page不能被过滤掉。
  • 过滤条件为field != value。假如value小于Zone Map索引的最小值小米8或value大于Zone Map索引的最大查找算法有哪些值,则Data Page不能被过索引页是哪一页滤掉。
  • 过滤条算法的空间复杂度是指件为field < value。假如value大于Zone Map索引的最小值,则Data Page不能被过滤掉。
  • 过滤条件为field <= value。假如value大于或等于Zone Map索引的最小值,则Data Page不能被过滤掉。
  • 过滤条件为field > value。假如value小于Zone Map索引的最大值,则Data Page不能被过滤掉。
  • 过滤条件为field >= value。假如value小于或等于Zone Map索引的最大值,则Data Pa算法ge不能被过滤掉。
  • 过滤条件为field IN {value1, value2, …}。假如value1、value2、…中至少存在一个值在Zone Map索引的最大算法工程师值与最小值之间,则Data Page不能被过滤掉。
  • 过滤条件为field IS NULL。假如Zone Map索引的has null为true(Data Page中含有NULL值),则Data Page不能被过滤掉。小米手机
  • 过滤条件为field IS NOT NULL。假如Zone M查找算法ap索引的has not null为true(Data Page中含有小米手机非NULL值),则Data二进制八进制十进制十六进制转换 Page不能被过滤掉。

关于未被Zone Map索引过滤的Data Page,能够运用Ordinal索引快速定位这索引符号些Data Page的开始行的行号,并获小米商城取这些Data Page的行规模。经过Data Page算法分析的目的是对应的Ordinal索引项快速获取当时Data Page的开始行的行号start,经过下一条Ordinal索引项快速获取后一个Data Page的开始行的行号en二进制的运算规则d,左闭右开区间[start, end)即为当时Data Page的row规模。

5Bitmap索引

为了加快数据查询,Apache Dor二进制的运算规则is支撑用户为某些字段增加Bitmap索引。Bitmap索引由两部分组成:

  • 有序字典:有序保存一列中一切的不同取值。
  • 字典值的Roaring位图:保存有序字典中每一个取值的Roaring位图,表明字典值在列中的行号。

例如:如图6所示,一列数据为[x, x, y, y, y, z, y, x, z, x],一共包括10行,则该列数据的Bitmap索引的有序字典为{x, y, z}, x索引页是哪一页、y、z对应的位图分别为:

x的位图: [0, 1, 7, 9]

y的位图: [2, 3, 4, 6]

z的位图: [5, 8]

深度解析|Apache Doris 索引机制解析

图6 Bitmap索引结构

5.1索引生成


数据刷写时,会给用户指定的列创立Bitmap索引。向列中每增加一个值,都会更新当时列的Bitmap索引。从Bitmap索引的有序字典中查找增加的值是否现已存在,假如本次增加的值在Bitmap索引的有序字典中现已存在,则直接更新该字典值对应的Roaring位图,假如本次增加的值在Bitmap索引的有序字典二进制中不存在,则将该算法导论值增加到有序索引字典,并为该字典值创立Roaring位图。当然,NULL值也会有单小米11独的Roaring索引位图。

Bi索引tmap索引的字典数据和Roaring位图数据分隔存储。

列中Bitmap索索引页是哪一页引的字典值会二分查找算法按次序保小米存在Dict Page中。Dic查找算法有哪些t Page中包括以下信息:Bitmap索引的字典数据、Dict Page的foot二进制计算器er以及Dict Page的Checksum信息。Dict Page的footer中包括当时Page的类型、当时Page中B索引itmap索引的字典数据的巨细、当时Page中Bitmap索引的字典值数目以及当时Page中第一个字典值在整个列的Bitmap索引字典值中的序号等信息。Bitmap索引的字典数据会按照LZ4F格式进行小米商城紧缩。

一个Dict Page写满之后,会创立新的Dict Page用于记载该列后续的字典数据。

假如某一列有多个Dict Page,则会选用两级索引机制。第索引二级索引为多个的Dict Page,其间保存Bitmap索引的字典数据,每一个Dict Page生成一索引条Value索引项,一切Dict Page二进制转八进制的Value索引项会被保存在一个Value Ind算法导论ex Pa二进制转换器ge中作为一级索引。每一个的Value索引项记载了当时Dict Page中第一个字典值的编码以及当时Dict Page在Segment文件中的offs折半查找算法et和巨细。

Value Index Page中包括以下信息:一切Di算法的五个特性ct Page的Value索引数据、Value Index Page的footer以及Value Index Pag算法是指什么e的Checksum信息。Va索引是什么意思lu顺序查找算法e Index Page的footer中包括当时Page的类型、当时Page中索引数据的巨细、当时Page索引图中索引项数目等。

一级索引Value Index Page在Segment文件中的offset和巨细会被记载在Segment文件的footer中。假如某一列只要一个Dict Page,则不需求两级索引,这个仅有的Dict Page在Segment文件中的offset二进制八进制十进制十六进制转换和巨细会被记载在Segment文件的footer中。Bitmap索引的字典数据的存储结构如图7所示。

深度解析|Apache Doris 索引机制解析

图7 Bitmap索引的字典数据的存储结构

列中Bitmap索折半查找算法引的Roar二分查找算法ing位图数据会保存在Bitmap Page中。

Bitmap Page中包括以下信息:Bitmap二进制索引的Roaring位图数据、Bitmap Page的footer以及Bitmap Page的Checksum信息。

Bitmap Pa小米运动ge的footer中包括当时Page的类型、当时Page中Bitmap索引的Roar索引超出了数组界限什么意思ing位图数据的巨细、当时Pa索引图ge中Bitmap索引的Roaring位图数目以及当时Page中第索引超出了数组界限什么意思一个Roaring位图在整个列的二进制亡者列车Bitmap索引的Roaring位图中的序号等信息。Bitmap索引的Roaring位图数据不进行紧缩。

一个Bitmap Page写满之后,会创立新的B索引查找算法itmap Page用于记载该列后续的Roaring位图数据。

假如某一列有多个Bitmap Page,则会选用两级索引机制。第二级索引为多个的Bitmap Page,其间保存Bit小米11ultramap索引的位图数据,每一个Bitmap Page生成一条Ordinal索引项,一切小米运动Bitmap Page的Or二分查找算法dinal索引项会被保存在一个Ordina二进制换成十进制算法l Index Page(留意,此处的Ordinal 索引与第3部分的O索引的作用rdinal 索引不同,此处的Ordinal 索引指向Bitmap Page,而第3部分的Ordinal 索引指向Data Page)中作为一级索引。

每一个的Ordinal索引项由key和value两部分组成,key记载了当时Bitmap Page中第一个Roaring位图在整个列的BitMap索引Roaring位图中的序号,value记载了当时B索引超出矩阵维度itmap Page在Segment文件中的offset和巨索引的作用细。

Ordinal Index Page中包括小米11以下信息:一切Bitmap Page的Ordinal 索引数据、Ordinal Index Pag算法的时间复杂度取决于e的footer以及O小米换机rdinal Index Page小米6的Checksu索引查找算法m信息。O二分查找算法rdinal Index Pa二进制转换器ge的footer中包括当时Page的类型、当时Page中索引数据的巨细、当时Page中索引项数目等。

一级索引Ordinal Index Pag算法是指什么e在Segment文件中的offset和巨细会被记载在Segment索引查找算法文件的foo二分查找算法ter中。假如某一列只要一个Bitmap Page,则不需求两级索引,这个仅有的Bitmap Page在Segment文件中的offset和巨细会被记载在Segment文件的footer中。Bitmap索引的小米运动Roaring位图数据的存储结构如图8所示。

深度解析|Apache Doris 索引机制解析

图8 Bitmap索引的Roaring位图数据的存储结构

5.2 查询过滤


数据查询时,会加索引载列的Bitmap索引数据,并解分出有序索引页是哪一页字典和Roaring位图数据。

  • 首要二进制转化为十进制查找算法有哪些经过Segment footer中记载的Bitmap索引的字典Meta信息判别当时列的Bitmap索引的字典是否含有两级索引,假如含有两级索引,则Segment footer中记载了一级索引Value Index Page在Block中的offset和巨细,首要加载一级索引Value Index Page,并解分出每一个的Value索引项,取得每一个Dict Page中小米云第一个字典值和每一个Dict Page在Segment文件中的offset和巨细;不然,当时列的Bitmap索引只含有一个Dict Page,Segment footer中记载了该二分查找算法Dic索引是什么意思t Page在Segment文件中的offset和巨细。能够经过Dict Page解分出每一个字典值。
  • 然后,经过Segment footer中记载的Bitmap索引的Roar算法的时间复杂度取决于ing位图Meta信息判别当时列的Bitmap索引的小米8Roaring位图是否含有两级索引,假如含二进制换成十进制算法有两级索引,则Segment footer中记载小米了一级索引Ordi算法的有穷性是指nal Index Page在Segment文件中的offset和巨细,首要加载一级索引Ordinal Index Page,并解分出每一个的O索引超出矩阵维度rdinal索引小米6项,取得每一个Bitm索引页是哪一页ap Page中第一个Ro算法分析的目的是aring位图在整个列的Bitmap索引Roaring位图中的序号以及每一个Bitmap Page在Segment文件中的off二进制计算器set和巨细;不然,当时列的Bitmap索引只含有一个Bitma索引符号p Page,Segment footer中记载了该Bitmap Page在Segment文件中的off二进制计算器set和巨细。能够经过Bitmap Page中解分出每一索引的优缺点个字典值对应的Roaring位图。

真正运用Bitmap索引进行数二进制怎么算据过滤时才会加载Dict Page和Bitmap Page。

运用某一个查询过滤条件进行行过滤的办法如下:

  • 过滤条件为field索引超出矩阵维度 = valu小米换机e。从 Dict Page 中寻觅第一个等于或大于 value 的字典值,而且获取该字典值在有序字典中的序号ordinal。假如寻觅到的字典值刚好等于value,则从 Bitmap Page 中读取第ordinal个位图,则该位图表明经二进制的运算规则过该查询条件过滤之后留下的行规模。
  • 过滤条件为field != value。从Dict Page中寻觅第一个等于或大于value的字典值,而且获取索引页是哪一页该字典值在有序字典中的序号ordinal。假如寻觅到的字典值刚好等于value,则从Bitmap Page中读取第ordinal个位图小米云,则该索引位图表明需求被过滤掉的行规模。
  • 过滤条件为field < value。从Dict Page中寻觅第一个等二进制转八进制于或大于value的字典值,而且获取该字典值在有序字典中的序号o小米11rdinal。从Bitmap Page中读取前面ordinal个位图,这些位图的并集表明经过该查询条件过滤之后留二进制下的行规模。
  • 过滤条件为field <= value。从Dict Pag小米商城e中寻觅第一个等于或大于value的字典值,而且获取该字典值在有序字典中的序号ordinal。假如寻觅到的字典值小米11刚好等于value,则从Bitmap Page中读取前面ordinal + 1个位图;假如寻觅到的字典值大于value,则从Bitmap Page中读取前面ordinal个位图,折半查找算法这些位算法分析的目的是图的并集表明经过该查询条件过算法的空间复杂度是指滤之后留下的行规模。
  • 过滤条件为field > value。从Dict Page中寻觅第一个等于或大于value的字顺序查找算法典值,而且获取该字典值在有序字典算法中的序号ordinal。假如寻觅到的字典值刚好等于value,则从Bitmap Page中读取第ordinal个位图之后的一切位图;假如寻觅到的字典值大于va算法是指什么lue,则从Bitmap Page中读取第ordinal以及之后的一切位图,这些位图的并集表明经过该查询条件过滤之后留下的行规模二进制
  • 过滤条件为索引的作用field >= v二进制换成十进制算法alue。从Dict Page中寻觅第一个等索引图于或大于value的字典值,而且获取算法是指什么该字典值在有序字典中的序号ordinal。从二进制Bitmap Pag算法e中读取ordinal之后的一切位图,这些位图二进制计算器的并集表明经过该查询条件过滤之后留下的行规模。

5.3 适用场算法的有穷性是指


Apache Doris查找算法有哪些支撑在建表时对指定的列创立Bitma二进制转八进制p索引,也能够对现已创立的表履行Alter Table指令增加Bitmap索引。

ALTER TABLE table小米8_name ADD INDEX index_name (column_name) USING BITMAP COMMENT ‘’小米商城;

目前只支撑对TINYINT、SMALLINT、INT、算法 UNSIGN算法分析的目的是EDINT、BIGINT、LARGEINT、CHAR、 VARCHAR、DATE、DATETI索引的作用ME、B顺序查找算法OOL和DECIMAL类型的字段创立Bitmap索引,其他类型的字段均不支撑Bitmap索引。Bitmap索引比较适合在基数较低的列上进行等值查询或二进制换成十进制算法规模查询的场景。

6 Bloom Filter 索引

Apac小米手机he Doris支撑用户对取值区分度比较大的快速查找算法字段增二进制八进制十进制十六进制转换Bloom Filter索引,Bloom Filter索引按照Data Page的粒度生成。数据写入时,会记载每一个写入Data P小米云age的值,当一个Data Page写满之后,会依据该Data Page的一切不同取值为该Dat小米11a Page生成Bloom F二进制计算器ilter索引。数据二分查找算法查询时,查询条件在设置有Bloom Filter索引的字段进行过滤,当某个Data Page的Blo二进制转化为十进制om Filter没有射中时,表明该Data Page中没有需求的数据,这样能够对Data Page进行快速过滤,削减不二分查找算法必要的数据读取。

6.1索引生成


数据刷写时,会给每一个Data Page创立一条Bloom Filter索引项。Apache Doris选用了二进制根据Bloc小米11k的Bloo算法的有穷性是指m Filter算法。每一个Data Page对应的Bloom Filter索引数据二进制会被划分为多个Block,每个折半查找算法Block的数据长度为BYTES_PER_BLOCK(默以为32字节,共256bit),Block中的每一个Bit位会被初始化为0。向Data Page中写入数据时,每一个不同的小米商城取值value都会将一个Block中的BITS_SET_PER_BLOCK(默认值为8)个Bit置位为1。Bloom Filter索引的结构如图9所示。

单个Data Page的Bloom Filter索引数据长度BLOOM_FILTER_BIT经过如下公式核算:

BLO索引超出了数组界限什么意思OM_F算法设计与分析ILTER_BIT = -N * ln(FPP) (ln(2) ^ 2)

其间,N表明当时Data Pag查找算法e中的不同取值的个数;FPP(False Positive Prob小米运动ablit小米运动y) 表明希望的误判率,默认取值为0.05小米11。(注:核算出的Bloom Filter数据长度(单位为bit)必定是2的整数次幂索引页是哪一页。)

Bloom Filter中,每一个Block的长度为BYTES_PER_BLOCK(32字节),因而,Bloom Filter中的Bloc算法的五个特性k数量经过如下公式核算:

BLOCK_NUM = (BLOOM_FIL折半查找算法TER_BIT 8) BY索引超出了数组界限什么意思TES_PER_BL算法的特征OCK;

为Data Page生成Bloom F小米ilter索引项的办法如下:

  • 针对Data Page中的每一个不同的取值val算法是指什么ue,核算出一个64位的HASH_CODE。Apache Doris中,Bloom Filter的Hash策略为HASH_MURMUR3。
  • 取HASH小米11_CODE的高32位核小米商城算出当时value在Bloom Filter中对应的Block,办小米换机法如下:

BLOCK_INDE快速查找算法X = (HASH_CODE >> 32) & (BLOCK_NUM – 1)

其间,BLO二进制计算器CK_INDEX表明小米8Block的序号,BLOCK_NUM为2的整小米8数次幂,则BLOCK_INDEX必定小于B小米8LOCK_NUM。

  • 取HASH_CODE的低32位核算出当时value会将Block中的哪些Bi索引t置小米应用商店位为1,办法如下小米
uint32_t key = (uint32_t)HASH_CODEuint32_t SALT[8] = {0x47b6137b, 0x44974d91, 0x8824ad5b, 0xa2b7289d, 0x705495c7, 0x2df1424b,小米换机 0x9efc4947, 0x5c6bfb31算法的空间复杂度是指};uint32_t masks[BITS_SET_PER_BLOCK];for (int i = 0; i < BITS_SET_PER_BLOCK; ++i) { masks[i] = key * SALT[i]; masks[i] = masks[i] >> 27; mask查找算法有哪些s[i] = 0x1 << masks[i];}

其间,masks[i]包括32个Bit,其算法的空间复杂度是指间只要1个Bit被置位为1,其他31小米云个Bit均为0。

  • 将masks[i]与Block中第i个32Bit按位取或,更新Data Page的Bloom Filte查找算法r索引数据。(一个Block中包括256个Bit,索引图即 BITS_SET_PER_BLOCK 个32 Bit)

|算法的特征 uint32_t* BLOCK_OFFSET = BLOOM_FILTER_OF算法的有穷性是指FSET + BYTES_PER_BL小米商城OCK * BLOCK_INDEXfor (int i小米手机 = 0; i < BITS_SET_PER_BLOCK; ++i) {*(BLOCK_OFFSET + i) |= masks[i];} | | ——小米商城二进制转八进制————————————————————————————————–小米商城——————————————————– |

其间,BLO顺序查找算法OM_FILTER_OFFSET表明当时Data Page的Bloom Filter的偏置,BLOCK_OFFSET表明当时block的偏置。

深度解析|Apache Doris 索引机制解析

图9 Bloom Filter索引的结构

Bloom Filter索引项中单独设置了Data Page中是否包括了二进制的运算规则NULL值的标志。

列中每一个Data Page的二进制转换器Bloom Filter索引项会被保存在Bloom Filter Index Page中。Bloom Filter Index Page中包括以下信息:Bloom Filt二进制计算器er索引项数据、Bloom Filter Index Page的footer以及Bloom Filter Index Page的Checksum信息。Bloom Filter Index Page查找算法的footer中包括当时Page的类型、当时Page中Bloom Filter索引项数据的巨细、当时Page中Bloom Fil算法的有穷性是指ter索引项数目以及当时Page中第一条索引项在整个列的Bloom Filter索引项中小米应用商店的序号等信息。

一个Bloom Filter Index Page写满之后,会创立新的Bloom Filter Index Page用于记载该列后索引失效的几种情况续的Bloom Filter索引项。假如某一列有多个Bloom Filter Index Page,则该列的Bloom Filter索引会选用两级索引机制。第二级索引为多个的Bloom Filter Index Page,其间保存Data Page的Bloom Filter索引数据,每一算法的空间复杂度是指个Bloom Filter Index Page生成一条Ordinal索引项,一切B小米8loom Filter Index Page的Ordinal索引项会被保存在一个Ordinal Inde索引页是哪一页x Page(留意,此处的Ordinal 索引与第3部分的Ordinal 索引不同,此处的Ordinal 索引指向Bloom Filter Index Page,而第3部分的Ordinal 索引指向Data Page)中作为一级索引。

小米6一个的Ordinal索引项由key和value两部分组成,key记载了当时Bloom Filter Index Page中第一条索引项在整个列的Bloom Filter索引项中的序号,value记载了当时Bloom Filter Index Page在Segment文件中的offset和巨细。Ordinal Index Page中包括以下信息:一切Bloom Filter I小米ndex Page的Ordinal 索引数据、Ordinal Index Pa小米云ge的footer以及O顺序查找算法rdinal Index Page的Checksum信息。Ordinal快速查找算法 Index P算法导论age的footer中包括当时Page的类型、当时Page中索引数据的巨细、当时Page中索引项数目等。一级索引Ordinal In二进制计算器dex Page在Segment文件中的offset和巨细会算法工程师被记载在Segment文件的footer中。假如某一列只要一个Bloom Filter Index Page,则不需求两级索引,这个仅有算法导论的Bloo索引是什么意思m Filter Index Page在Segment二进制亡者列车文件中的offset和巨细会被记载在Segment文件的fo二进制转换器oter中。Bloom Filter索引的存储结构如图10所示。

深度解析|Apache Doris 索引机制解析

图10 Bloom Filter索引的存储结构

6.2 查询过滤


数据查询时,会加载列的Bloom Filter索引数据,并解分出每一个Data Page的Bloo索引的作用m Filter索引项。首要,经过Segme小米商城nt footer中记载的Bloom索引查找算法 Filter索引算法导论的Meta信息判别当时列的Bloo二进制亡者列车m Filter是否含有两级索引,假如含有两级索引,则Segment footer中记载了一级索引Ordinal Index Page在Segment文件中的offs顺序查找算法et和巨细算法导论,先加载一级索引Ordinal Index Page,并解分出每一个的Ordinal索引项的key和value,key记载了每一个Bloom Filter Index Page中第一条索引项在整个列一切的Bloom Filter索引项中的索引查找算法序号,value记载了每一个Blo折半查找算法om Filter In二进制转换器dex Page二进制转化为十进制在Segment文件中的二进制计算器of算法分析的目的是fset和巨细;不然,当时列的Bloom Filter索引只含有一个Bloom Filter索引失效的几种情况 Index Page,Segment footer中记载了该Bloom Filter Index Page在Segment文件中的offset索引页是哪一页和巨细二进制换成十进制算法。能够经过Bloom F小米云ilter Index Page解分出每一个Data Page的Bloom Filte小米11ultrar索引数据。

判别某个值value是否射中Bloom Filter的办法如下:

  • 首要,根据HASH_MURMUR3办法对查询过滤条件的值value核算出64位的HASH_CODE;
  • 然后,选用与生成Bloom Filter索引数据相同的办法核算出该value值在Bloom Filter中对应的Blo算法的五个特性ck,以及在Block中对应的BITS_SET_PER_BLOCK个Bit位。
  • 判别Bloom Filter索引数据中对应Block的这BITS_SET_PER_BLOCK个Bit的值是否均为1。假如对应Block中的这BITS_SET_PER_BLOCK个Bit值均为1,则表明Bloom Filter射中,该value值在Bloom Filter对应的Data Page中或许存在;索引符号不然,表明Bloom Filter未射中,该valu小米8e值在二分查找算法Bloom Filter对应的Data Page中必定不存在。

数据查询时,查询过滤条件(”=”、”IS”或”IN”句子)在设置有Bloom Filter索引的列依次对每一个Data Page进行过滤。进行NULL值查询时,能够直接运索引是什么意思用Bloom Filter索引项中的NULL值标志进行Data Page过滤。进行非NULL值查询时,运用查询过查找算法有哪些滤条件对Data折半查找算法 Page进行过滤的办索引页是哪一页法如下:

  • 过滤条件为field = value。假如value未射中某一个Data Pa二进制转八进制ge对应的Bloom Filter,则该Data Page能够被过滤掉。
  • 过滤条件为field IN {value1, value2, …}。假如 value1、value2、.二进制计算器..中一切值都未射中某一个Data Page对应的Bloom Filter,则该索引页是哪一页Data Page能够被过滤掉。

过滤条件为field IS NULL。假如NULL值未射中某一个Data Page对应的Bloom Filter,算法是指什么则该Data Page能够被过滤掉。

6.3适用场景


A索引图pache Doris支撑在建表索引的优缺点时对指定的列创立Bloom Filter索引,小米也能够对现已创立的表查找算法有哪些履行Alter Table指令增加Bloom Filter索引。

ALTE索引页是哪一页R TABLE table_name SET (“bloom_filte快速查找算法r_columns”=”c算法的特征1, c2, c3″);

目前只支撑对SMALLINT、INT、UNSIG索引NEDINT、 BIGI算法分析的目的是NT、LARGEINT、CHAR、 VARCH索引图AR、DATE、DATETIME和DECIMAL类型的字段创立索引的优缺点Bloom Filter索引,其他类型的字段均不支撑Bloo算法的有穷性是指m Filter索引。关于创立了Bloom Filte小米r索引的字段,查询条件是”=”、”i算法的空间复杂度是指s”或”in”句子时,才会运用Bloom Filter索引进行Data Page的过滤。Bloom Filter索引比较适合在基数较高的列上进行等值查询的场景。

结束语

为了加快数据查询功率索引失效的几种情况,Apache Doris 的存储引擎供给了前缀索引、Ordinal 索引、Zone Map索引、Bitmap 索引和 Bloom Filter 索引,能够在数据读取之前快速地进行数据过滤。前缀索引、Ordinal 索引和 Zone算法设计与分析 Map 索引不需求用户干涉,会跟着数据折半查找算法写入主动生成;数索引符号据写入时默认不会生成 Bitmap 索引和 Bloom Filter 索引,用户能够小米应用商店有挑选地为指定的列增加这两种索引。本文主要从索引失效数据写入进程中索引的生成、索引的物理存储结构以及数据查询进程中怎么运用索引进行数据过滤等方面对这几种索引二进制计算器的的底层机制分别进行了具体地分析。

作者简介

魏祚

小米分布式存储工程师

Apache Doris二进制的运算规则 PMC

负责Apache Dor快速查找算法is的开发和运维

专心二分查找算法于分布式存储引擎的研制和优化

发表评论

提供最优质的资源集合

立即查看 了解详情