StoneDB 的整体架构分为三层,别离是应用层、服务层和存储引擎层。应用层次要负责客户端的连贯治理和权限验证;服务层提供了 SQL 接口、查问缓存、解析器、优化器、执行器等组件;Tianmu 引擎所在的存储引擎层是 StoneDB 的外围,数据的组织和压缩、以及基于常识网格的查问优化均是在 Tianmu 引擎实现。上面为大家具体介绍 StoneDB 整体架构中的次要个性。
列式存储
StoneDB 创立的表在磁盘上是以列模式进行存储的,因为关系型数据库中每一列的数据类型都雷同,所以这种间断的空间存储与行式存储相比,更加可能实现数据的高压缩比。在读取数据方面,如果只想查问一个字段的后果,在行式存储中,引擎层向服务层返回的是一整行的数据,须要耗费更多的网络带宽和 IO。而列式存储只须要返回一个字段,极大缩小了网络带宽和 IO 的耗费。另外,列式存储无需再为列创立索引和保护索引。
id | name | age |
---|---|---|
1 | Jack | 37 |
2 | Rose | 18 |
3 | Jason | 26 |
数据压缩
下面提到同一数据类型的列存储在一起,可能实现数据的高压缩比。StoneDB 会依据不同的数据类型抉择不同的压缩算法,目前反对的压缩算法次要有 PPM、LZ4、B2、Delta 等。数据被压缩后,数据量变得更小,在读取数据时,对网络带宽和磁盘 IO 的压力也就越小。因为列式存储相比行式存储有十倍甚至更高的压缩比,StoneDB 能够节俭大量的存储空间,升高存储老本。
常识网格治理
当表的数据量达到千万、亿级,在做统计分析类查问时,应用 MySQL 的 InnoDB 存储引擎或其它关系型数据库的行式存储引擎可能须要几分钟到几十分钟能力失去后果集。这是因为基于老本的优化器须要依据表或者索引的统计信息生成执行打算,而后再去读取数据,两头过程会产生 IO,如果统计信息不准,生成了一个谬误的执行打算,那么可能会产生更多的 IO。而 StoneDB 的 Tianmu 引擎在雷同的数据量下,比 MySQL 的 InnoDB 存储引擎或或其它关系型数据库的行式存储引擎要快数十倍。Tianmu 引擎除了列式存储、数据压缩个性外,还有常识网格技术。在理解常识网格前,须要理解以下几个基本概念。
Data Pack
数据包用于寄存理论数据,是最底层的数据存储单元,每列依照 65536 行切分成一个数据包。每个数据包比列更小,具备更高的压缩比,而每个数据包又比每行更大,具备更好的查问性能。数据包是常识网格的解压缩单元。
粗糙集是一门数学学科,用来钻研不残缺的数据,不准确的常识表白、学习、演绎等的一套实践。在 StoneDB 中,粗糙集用于对数据包的划分,依据 SQL 的查问条件的数据在数据包中的确认范畴,数据包分为以下几类:
1)不相干的数据包:示意不满足查问条件的数据包,这类数据包间接被疏忽。
2)相干的数据包:示意满足查问条件的数据包,如果要查问相干的数据包外面的具体数据,须要对数据包进行解压缩,如果依据数据包的元数据节点就能失去数据,那么就不须要解压缩数据包。
3)可疑的数据包:示意数据包中的数据局部满足查问条件,须要进一步解压缩数据包能力失去满足条件的数据。
Data Pack Node
数据包节点也称为元数据节点,记录了每个数据包中列的最大值、最小值、平均值、总和、总记录数、null 值的数量、压缩形式、占用的字节数。每一个元数据节点对应一个数据包。
Knowledge Node
元数据节点的上一层是常识节点,除了记录数据包之间或者列之间关系的元数据汇合,比方数据包的最小值与最大值范畴、列之间的关联关系外,还记录了数据特色以及更深度的统计信息。大部分的常识节点数据是装载数据的时候产生的,另外一部分是查问的时候产生的。
常识节点的 3 种根本类型:
1)Histogram
数据类型为整型、日期型、浮点型的列的统计值以直方图的模式存在。将一个数据包的最小值到最大值之间分为 1024 段,每段占用一个 bit,如果数据包中的理论值处于段中的范畴,则标记为 1,否则标记为 0。Histogam 在数据被加载时主动创立。
如下的例子中,阐明数据包中有值落在 0~100 和 102301~102400 两个区间。
0‒100 | 101‒200 | 201‒300 | … | 102301‒102400 |
---|---|---|---|---|
1 | 0 | 0 | … | 1 |
如果想要执行以下 SQL:
select * from table where id>199 and id<299;
通过直方图可知,这个查问没有在这个数据包命中,即以后数据包不满足查问条件,这个数据包间接被抛弃。
2)Character Map
数据类型为字符串的列的字符映射表。统计以后数据包内 1~64 长度中 ASCII 字符是否存在。如果存在,则标记为 1,否则标记为 0。字符检索时,依照字符程序顺次比照字符标识值即可晓得该数据包是否蕴含匹配数据。Character Map 在数据被加载时主动创立。
如下的例子中,阐明 A 在字符串的第 1 个和第 64 个地位。
Char/Char pos | 1 | 2 | … | 64 |
---|---|---|---|---|
A | 1 | 0 | … | 1 |
B | 0 | 1 | … | 0 |
C | 1 | 1 | … | 1 |
… | … | … | … | … |
3)Pack to Pack
包对包关系示意不同表的两个列之间的等值映射表,并以二进制矩阵的模式进行存储,如果合乎表关联条件,则标记为 1,否则标记为 0。包对包关系能帮忙在表关联查问的时候疾速判断出合乎查问条件的数据包,从而晋升表关联查问的效率。表关联查问时,Pack to Pack 被主动创立。
如下的例子中,表关联的查问条件是 ”A.C=B.D”,在 A.C1 这个数据包中,只有 B.D2 和 B.D5 这两个数据包中有合乎表关联条件的值。
B.D1 | B.D2 | B.D3 | B.D4 | B.D5 | |
---|---|---|---|---|---|
A.C1 | 0 | 1 | 0 | 0 | 1 |
A.C2 | 1 | 1 | 0 | 0 | 0 |
A.C3 | 1 | 1 | 0 | 1 | 1 |
Knowledge Grid
常识网格由元数据节点和常识节点组成,在做统计分析类查问时,StoneDB 依据常识网格技术过滤掉不相干的数据包,如果只剩下相干数据包,那么只须要读取元数据就能返回查问后果。这样就打消理解压缩数据包的过程和升高 IO 耗费,进步了查问响应工夫和网络利用率。
接下来,咱们通过一个例子来了解一个查问语句在存储引擎层应用常识网格技术的查问优化过程。
有如下的查问语句和数据包节点的数据值散布范畴。
select min(t2.D) from t1,t2 where t1.B=t2.C and t1.A>15;
Min. | Max. | |
---|---|---|
t1.A1 | 1 | 9 |
t1.A2 | 10 | 30 |
t1.A3 | 40 | 100 |
- 依据列 A 的 DPN 可知,t1.A1 属于不相干的数据包,t1.A2 属于可疑的数据包,t1.A3 属于相干的数据包,这一步就过滤掉数据包 t1.A1。
t2.C1 | t2.C2 | t2.C3 | t2.C4 | t2.C5 | |
---|---|---|---|---|---|
t1.B1 | 1 | 1 | 1 | 0 | 1 |
t1.B2 | 0 | 1 | 0 | 0 | 0 |
t1.B3 | 1 | 1 | 0 | 0 | 1 |
- 第一步曾经过滤掉数据包 t1.A1,这一步就不须要对 t1.B1 和 t2.C1 做关联比照,依据包对包关系的映射表可知,这一步过滤掉数据包 t2.C3 和 t2.C4。那么满足关联条件的数据包有 t2.C2 和 t2.C5。
Min. | Max. | |
---|---|---|
t2.D1 | 0 | 500 |
t2.D2 | 101 | 440 |
t2.D3 | 300 | 6879 |
t2.D4 | 1 | 432 |
t2.D5 | 3 | 100 |
- 第一步和第二步曾经过滤掉 D1、D3、D4,那么只剩下 D2 和 D5,依据列 D 的 DPN 可知,D5 的最大值 100 小于 D2 的最小值 101,这一步过滤掉数据包 D2。最初只剩下数据包 D5,依据元数据失去 D5 的最小值 3。
高性能导入
StoneDB 提供独立的数据导入客户端,反对不同的数据源环境,反对多语言架构。数据在导入前,首先会进行预处理,如数据压缩和常识节点的构建。数据通过预处理后,进入存储引擎无需再次执行解析、数据验证以及事务处理等操作。
于 StoneDB 的任何问题,都能够加我 V 征询:StoneDB_2022。