列数据库存储技术笔记

简介: # 列数据库存储技术 这个slide:[VLDB 2009 Tutorial on Column-Stores](http://www.slideshare.net/abadid/vldb-2009-tutorial-on-columnstores)将列数据库相关的技术keyword都列举出来了:storage && compression、query execution engine、CP

列数据库存储技术

这个slide:VLDB 2009 Tutorial on Column-Stores将列数据库相关的技术keyword都列举出来了:storage && compression、query execution engine、CPU、Memory。

本文就是对 compression 这个点的相关技术的收集:

行存储的数据库多采用稠密索引,如果数据库文件中的数据不是按照关键字的顺序排列(例如按照大小、时间前后),需要对为每一行数据基于此关键字创建一个索引项。会导致:
1 增加存储空间
2 增加数据更新时的代价。

因此基于行存储的RDBMS系统为表中的所有列创建索引是不现实的,所以如果一个查询sql的查询条件是基于一个没有索引的列,则数据库必须做全表扫描,数据量大的情况下响应效率不高。

列存储可以为所有列创建稀疏索引,每个列的值被压缩算法压缩之后顺序存储到数据块中,索引只需建立到数据块上,索引的存储空间小,而且更新维护的代码也小。也就说将行存储中的行级索引更新为列存储的数据块索引(列数据库主要面向OLAP场景,查询SQL多为聚合类型,每次查询的数据量很多,硬盘数据的访问加载都是block级别,不像OLTP查询只是少量的几条。这也可以理解为什么HiStore说大数据量下的查询效率高于MySQL,而单条查询却不会高于MySQL)。列存储下,查询语句通过索引定位到某一个数据块,然后使用某种查询算法访问数据块中的顺序数据,避免任何字段的查询导致全表扫描。

优点:

  • 数据高压缩率,节省存储空间
  • 减少磁盘IO数量,只取所需
  • 适合大批量数据的aggregation queries

缺点:

  • 空间换时间,数据还原、计算需要CPU资源

存储关键技术

列数据库的按照数据块为单位来存储数据,常见存储的压缩算法有如下几种:

  • 游程长度压缩算法(Run-Length Encoding,RLE)
  • 词典编码算法(Dictionary Encoding)
  • 位向量算法(Bit-Vector Encoding)

游程长度压缩算法

RLE(介绍) 算法是一个无损压缩算法(无损数据压缩算法的历史),核心思想是将一个序列连续重复出现N此的元素(元素组)转化为一个三元组(元素值,序列中第一次出现的位置,出现次数)。例如AAAAABBC,RLE压缩之后是(A,1,5),(B,6,2),(C,8,1),so问题来了,如果是ABCABCABC类型的数据奈若何呢?AABCDEEF这种基数类型大的数据又如何呢?
这里有相应的解决方案介绍:算法系列之八:RLE行程长度压缩算法

更厉害的:
RLE是对连续重复的数据进行压缩处理的---这个在图片、视频、音频领域都都适用,LZ77是对不连续重复的数据进行压缩处理的(也就是下面的词典编码算法). 在字符串匹配场景中,LZ77的压缩率会比RLE要高,LZ77用于ZIP压缩:ZIP压缩算法详细分析及解压实例解释,RLE + Huffman(Deflate/Inflate)。

词典编码算法

词典编码算法通过“原始值-替代值”的映射词典,将数据中”原始值“替换为更为简短的“替代值”。具体的实现算法分2种:
第一种是查找正在压缩的字符序列是否在以前输入的数据中出现过,然后用已经出现过的字符串替代重复的部分,它的输出仅仅是指向早期出现过的字符串的“指针”。例如:LZ77以及改良版LZ78、LZSS算法。

借用别人ppt中的图片,️
image

LZ77算法包括一个(sliding window滑动窗口,大概是一个容量可变的存储器)和一个预读缓存器(read ahead buffer)。sliding window是由0-64K的input stream,LZSS是用4K的sliding window.sliding window后面的字节填充预读缓存器,预读缓存器的大小通常在0-258K,与sliding window对应的.
LZ77就是处理sliding window和预读缓存器的匹配,如果这个匹配的长度大于最小匹配长度(最小匹配长度取决于编码器,通常取决于sliding window的长度。比如一个4K的sliding window,最小匹配长度为2),然后输出一个,长度(length)是这个匹配的长度,距离(distance)是在向前多少字节的地方匹配的。

第二种是基于源数据中创建一个“短语词典(dictionary of the phrases)”,短语可以是任意字符的组合。算法在编码数据过程中遇到已经在词典中出现的“短语”时,就将原始值替换为这个词典中的短语的“替换值”。典型代表是:LZW,LZW算法的专利是美国Unisys所有,非商业软件公司可以免费试用LZW。

再次借用别人ppt中的图片,
image

位向量编码算法

这个听着高大上的算法其实就是位图索引算法,适用于低基数的列,相对于B树索引,它的count,and,or操作更有效,位图索引位存放的是0,1的bit,相对于B树索引,占字节数特别少,不适合update、insert、delete频繁的列-因为要一个数据的更新可能会导致2个位图向量的更新(分段位图索引 Multi Components Bitmap Index)。
如果数据基数大,创建的位图索引会越来越多,空间占用也会很大,所以,位图索引 + RLE 可以算作天作之合,例如:

id 年龄 消费
1 25 60
2 45 60
3 50 75
4 50 100
5 50 120
6 70 110
7 85 140
8 30 260
9 25 350
10 45 270
11 50 260
12 60 400

对年龄和消费创建位图索引。

对于“年龄”字段有7个值,位图索引有7个向量:
25: 100000001000
30: 000000010000
45: 010000000100
50: 001110000010
60: 000000000001
70: 000001000000
85: 000000100000

查询所有年龄在[30,55]之间用户的消费数据:
30: 000000010000 and 45: 010000000100 and 60: 000000000001

在这个例子下年龄是稀疏字段,除非有龟鹤延年的人,正常数据范围是1-100,假设有天地同寿的仙人消费记录,随着年龄的数据增多,向量个数增多,占用的空间也会增多,这时应该召唤压缩算法:RLE。

算法思想:
就是将1前面的N个0用少量的二进制数字记录。

算法规则:

  • n是向量中某个1之前0的个数
  • e是n的二进制格式下的数据
  • m是e的长度,如果n=0,m=0;n=1,m=0
  • t是(m-1)个'1'和1个'0'组成的字符串,如果n=0,t='0';n=1,t='0'

例如:
示例1:
字符串:00000000000001,不用数了,1之前真的是13个0,n=4,13=0b1101,e=1101,m=3,t=1110,压缩之后的字符串为:11101101
示例2:
字符串:0,压缩:00
示例3:
字符串:1,压缩:01
示例4:
字符串:1100000010000000001,切分为4组字符串:[1,1,0000001,0000000001],对应的压缩组:[00,00,110110,11101001],最终的字符串:000011011011101001

这里有更详细、更多的位图压缩算法:位图索引算法

参考:java bitmap/bitvector的分析和应用

结束

这个只是存储相关的,执行过程的优化和cpu cache line黑科技的应用都有待挖掘、总结~~~

目录
相关文章
|
12天前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
36 3
|
12天前
|
数据库 索引
深入理解数据库索引技术:回表与索引下推详解
【10月更文挑战第23天】 在数据库查询性能优化中,索引的使用是提升查询效率的关键。然而,并非所有的索引都能直接加速查询。本文将深入探讨两个重要的数据库索引技术:回表和索引下推,解释它们的概念、工作原理以及对性能的影响。
31 3
|
18天前
|
存储 NoSQL 关系型数据库
数据库技术深度解析:从基础到进阶
【10月更文挑战第17天】数据库技术深度解析:从基础到进阶
47 0
|
11天前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
|
9天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
23 3
|
11天前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
11天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
20 4
|
9天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
13 1
|
11天前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
29 2
|
14天前
|
存储 SQL NoSQL
数据库技术深度探索:从关系型到NoSQL的演变
【10月更文挑战第21天】数据库技术深度探索:从关系型到NoSQL的演变
20 1