OLAP引擎常见索引技术介绍


在OLAP存储引擎中,索引犹如书的目录能够快速定位所查的数据,直接在数据源端把无关的数据过滤掉, 只把满足条件的有效数据参与计算。现在即便有各种硬件加速(GPU, FPGA等)以及Vectorized Processing (如monetdb, Vectorwise,clickhouse等),这些新技术能够极大提高数据处理的吞吐,加速查询;但“古老”的索引技术也一直是研究的重点,尤其在OLAP领域a.索引造成的数据膨胀与OLAP海量数据高压缩需要的矛盾;b.海量数据索引构建与有限资源的矛盾,需我们去找一个更好的解决方案。

介绍前先介说下索引的分类,便于读者不迷失方向。索引的分类其实是个比较难的问题,不同视角有不同的分法: 比如从维度方面考虑,可以分1. 一维索引(Bitset类,B-Tree类, Trie类,Skiplist类等),2. 高维空间索引(KD-Tree, R-Tree等);而数据库的索引一般有主键索引,二级索引,聚集索引,唯一索引等。本文主要从影响OLAP存储设计维度来介绍一些的重要索引机制:

a.  隐性索引
b.  聚集索引
c.  二级索引
d.  粗糙集(Knowledge Node)
e.  倒排索引
f.  自适应索引

1. 隐性索引

表的“分区”是具有索引属性的,“分区”决定了数据的分布,查询时可以通过查询条件进行“分区裁决”来优化查询。分区常见的有一级分区,二级分区或。业务上通常通过一级分区把数据分布在不同的节点,通过二级分区对数据进行生命周期管理。

2. 聚集索引

聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。像传统的OLTP数据库,主键索引一般是聚集索引(postgresql不是)。即使没有主键索引,也会默认以rowId作为聚集索引,聚集索引一般只有一个。在OLAP领域,主键索引不一定实现成聚集索引,而且聚集索引也可以多个。聚集索引不仅有索引的功能,还能够决定数据的物理布局,对某些查询能够很好优化io性能,比如select c1, c2, c3 from t1 where id < 1000 and id > 100; id列是否创建聚集索引,会导致最终底层访问的IO情况截然不同。
OLAP的列式存储可以拥有多个聚集索引,比如C-Store(http://db.csail.mit.edu/projects/cstore/)的projections概念,C-Store 通过数据冗余,可以按不同维度创建多个projections, 其中一个projections一定要包含所有的列,剩余的可以只需要冗余部分列。 如下图: table 有saleId, date, region, prodid四列,

C-store

由于列存数据的高压缩特性,以及只需要包含指定的列,多个聚集索引只要在业务层合理规划下,整体开销相比带来的效益是可以接受的;对于行存多个聚集索引的整体开销会大很多。

3. 二级索引

二级索引是一种非聚集索引,非聚集索引制定了表中记录的逻辑顺序,但是记录的物理顺序和索引不一定一致。一般聚集索引的key由原表二级索引列+ PrimaryKey构成,使用时通过二级索引列查到满足条件的PrimaryKey;再通过PrimaryKey反查原表。
二级索引一般不会创建太多的,考虑到动态构建二级索引IO和CPU开销, 以及数据膨胀带来的存储开销。对于一个实时系统,由于数据的动态变化,相比静态数据要想获取很高的压缩更具挑战;同时如果是实时随机更新数据,索引的维护会产生很严重的IO放大。当然如果是对于静态数据,同时采取批量更新的模式那就能比较好的控制数据膨胀和IO放大,一般倒排索引就采用模式。
二级索引的选择和使用是一个很有挑战的话题。简单说如果系统每次可以使用一个二级索引,那么就根据统计信息使用筛选率最高的那个;如果系统可以使用多个二级索引,最简单方式是是每个二级索引都用上,但事实上最佳方式可能只需要使用一些,剩余的列直接过滤。

4. 粗糙集(Knowledge Node)

这个定义估计说不好,直接上例子。粗糙集使用最具代表的是Infobright,Infobight把数据分成两层,如下图:


Infobight

底层是压缩的数据块(Data Packs),它存储用户实际的数据,上一层是知识网格(Knowledge Grid),它里面存的是Data Packs的一些统计信息,比如对应的Data Packs里面数据的MIN, MAX, SUM, AVG,COUNT, and No. of NULLs以及数据分布的直方图. 查询引擎利用Knowledge Grid把查询无关的Data Packs高效的筛选出,避免全表scan.


Knowledge Node

这种基于粗糙集的策略,在列属性物理布局有一定规律的情况效果会很好,比如表按ID递增方式存储,那么对于select * from t1 where id < 1000 and id > 100这种查询效率会非常高,但如果列属性是完全随机物理布局的,那么Knowledge Grid就起不了很大的作用。

5. 倒排索引

Inverted Index

倒排索引最核心的索引组织如上图:词典, 倒排链, 以及词典的索引。对于查询如select * from table where name = “Ada”or name = “Sara”, 我们可以利用倒排索引把term = “Ada”和 term = “Sara”的倒排链获取到,然后把目标倒排列进行or操作,就得到了我们的目标行号,然后再按需反查明细。倒排索引是一门非常复查的技术,深入研究可以参考lucene。倒排索引对存储一个重要的影响是,倒排索引的倒排链一般存的是行号(相比主键更好压缩,存储空间少),存储的数据一旦行号变化了,那么倒排索引需要进行更新甚至重构。像innodb, myrocks这些基于B-tree或LSM-tree的存储底层都是按主键排序的,在数据更新时数据的行号可能会发生改变;postgresql的存储由于引入tuple identifier (TID) ,由block num和内部offset构成,可以看成行号,但不能保证连续递增,平时在增删改时能够维持不变,只有在空间整理时才改变。以倒排索引为核心索引的存储一般采用“append + 标记删除”模式, 来保证行号不变,减少索引的重构。
只考虑单列的倒排索引和二级索引有点像,倒排索引构建也会面临:

a) 数据膨胀
b) IO消耗
c) CPU消耗问题。

6. 自适应索引(Adaptive Indexing)

Adaptive Indexing属于Database Cracking范畴,Adaptive Indexing的目标和动机:

  1. 让用户不感知非业务相关的索引(像主键索引,唯一索引这种和业务相关,为加速查询的索引为非业务相关),对用户使用友好
  2. 在有限的资源下,能够平衡好索引构建的资源开销和查询性能, Daniel Abadi在The Design and Implementation of Modern Column-Oriented Database Systems提到了3个特征
    a) 自适应性: 在系统空闲或者我们需要时才做
    b) 部分性: 只构建所涉及数据的索引
    c) 连续性: 系统能够不断向最优方案迭代

一个简单例子: 以Monetdb为例,Monetdb的数据按列存储,称为BAT(Binary Association Table)对于下面查询:
Q1. Select * from R where R.A > 10 and R.A < 14
Q2. Select * from R where R.A > 7 and R.A <= 16
Monetdb能够在查询的过程同时进行了索引的增量构建


Adaptive Indexing

索引技术是一门很深的话题,本文只是简单介绍了OLAP引擎常见的一些索引,通常OLAP引擎也只会以某一种索引作为其主要的策略。

文献参考:

  1. Brighthouse: An Analytic Data Warehouse for Ad-hoc Queries
  2. The Design and Implementation of Modern Column-Oriented Database Systems
  3. Monet; a next-Generation DBMS Kernel For Query-Intensive Applications
  4. Database Cracking: Towards Auto-tuning Database Kernels
  5. http://www.interdb.jp/pg/pgsql01.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容