【StoneDB Class】入门第二课:StoneDB整体架构解析

【StoneDB Class】入门第二课:StoneDB整体架构解析
StoneDB 的整体架构分为三层,分别是应用层、服务层和存储引擎层。应用层主要负责客户端的连接管理和权限验证;服务层提供了 SQL 接口、查询缓存、解析器、优化器、执行器等组件;Tianmu 引擎所在的存储引擎层是 StoneDB 的核心,数据的组织和压缩、以及基于知识网格的查询优化均是在 Tianmu 引擎实现。下面为大家详细介绍 StoneDB 整体架构中的主要特性。

列式存储

StoneDB 创建的表在磁盘上是以列模式进行存储的,由于关系型数据库中每一列的数据类型都相同,所以这种连续的空间存储与行式存储相比,更加能够实现数据的高压缩比。在读取数据方面,如果只想查询一个字段的结果,在行式存储中,引擎层向服务层返回的是一整行的数据,需要消耗更多的网络带宽和 IO。而列式存储只需要返回一个字段,极大减少了网络带宽和 IO 的消耗。另外,列式存储无需再为列创建索引和维护索引。

id name age 1 Jack 37 2 Rose 18 3 Jason 26

【StoneDB Class】入门第二课:StoneDB整体架构解析

数据压缩

上面提到同一数据类型的列存储在一起,能够实现数据的高压缩比。StoneDB 会根据不同的数据类型选择不同的压缩算法,目前支持的压缩算法主要有 PPM、LZ4、B2、Delta 等。数据被压缩后,数据量变得更小,在读取数据时,对网络带宽和磁盘 IO 的压力也就越小。由于列式存储相比行式存储有十倍甚至更高的压缩比,StoneDB 可以节省大量的存储空间,降低存储成本。

知识网格管理

当表的数据量达到千万、亿级,在做统计分析类查询时,使用 MySQL 的 InnoDB 存储引擎或其它关系型数据库的行式存储引擎可能需要几分钟到几十分钟才能得到结果集。这是因为基于成本的优化器需要根据表或者索引的统计信息生成执行计划,然后再去读取数据,中间过程会发生 IO,如果统计信息不准,生成了一个错误的执行计划,那么可能会发生更多的 IO。而 StoneDB 的 Tianmu 引擎在相同的数据量下,比 MySQL 的 InnoDB 存储引擎或或其它关系型数据库的行式存储引擎要快数十倍。Tianmu 引擎除了列式存储、数据压缩特性外,还有知识网格技术。在了解知识网格前,需要了解以下几个基本概念。

Data Pack

包用于存储实际数据,是最低的数据存储单元。每列按照65536行被分成一个包。每个数据包比列小,压缩比高,而每个数据包大于每行,查询性能更好。包是知识网格的解压缩单元。

[En]

The packet is used to store the actual data and is the lowest data storage unit. Each column is divided into a packet according to 65536 rows. Each packet is smaller than the column and has a higher compression ratio, while each packet is larger than each row and has better query performance. Packet is the decompression unit of knowledge grid.

粗糙集是一门数学学科,用来研究不完整的数据,不精确的知识表达、学习、归纳等的一套理论。在 StoneDB 中,粗糙集用于对数据包的划分,根据 SQL 的查询条件的数据在数据包中的确认范围,数据包分为以下几类:
1)不相关的数据包:表示不满足查询条件的数据包,这类数据包直接被忽略。
2)相关的数据包:表示满足查询条件的数据包,如果要查询相关的数据包里面的具体数据,需要对数据包进行解压缩,如果根据数据包的元数据节点就能得到数据,那么就不需要解压缩数据包。
3)可疑的数据包:表示数据包中的数据部分满足查询条件,需要进一步解压缩数据包才能得到满足条件的数据。

【StoneDB Class】入门第二课:StoneDB整体架构解析

Data Pack Node

数据包节点也称为元数据节点,记录了每个数据包中列的最大值、最小值、平均值、总和、总记录数、null值的数量、压缩方式、占用的字节数。每一个元数据节点对应一个数据包。

Knowledge Node

元数据节点的上层是知识节点,除了记录分组或列之间的关系的元数据集合,如分组的最小值和最大值的范围以及列之间的关系外,还记录了数据特征和更深入的统计信息。大部分知识节点数据是在加载数据时生成的,另一部分是在查询时生成的。

[En]

The upper layer of the metadata node is the knowledge node, in addition to recording the set of metadata that records the relationship between packets or columns, such as the range of minimum and maximum values of packets and the relationship between columns, the data characteristics and more in-depth statistical information are also recorded. Most of the knowledge node data is generated when loading data, and the other part is generated when querying.

知识节点的3种基本类型:

1)Histogram

数据类型为整型、日期型、浮点型的列的统计值以直方图的形式存在。将一个数据包的最小值到最大值之间分为1024段,每段占用一个 bit,如果数据包中的实际值处于段中的范围,则标记为1,否则标记为0。Histogam 在数据被加载时自动创建。
在下面的示例中,显示了数据包中的值介于0100%和102301102400之间。

[En]

In the following example, it is shown that the value in the packet falls between 0100 and 102301102400.

0‒100 101‒200 201‒300 … 102301‒102400 1 0 0 … 1

如果想要执行以下 SQL:

select * from table where id>199 and id

从直方图可以看出,查询没有命中该报文,即当前报文不满足查询条件,直接丢弃该报文。

[En]

From the histogram, we can see that the query did not hit the packet, that is, the current packet does not meet the query conditions, and the packet is directly discarded.

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 消耗,提高了查询响应时间和网络利用率。
接下来,我们通过一个例子来理解一个查询语句在存储引擎层使用知识网格技术的查询优化过程。
有以下查询语句和分组节点的数据值分布范围。

[En]

There are the following query statements and the data value distribution range of the packet node.

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

  1. 根据列 A 的 DPN 可知,t1.A1 属于不相关的数据包,t1.A2 属于可疑的数据包,t1.A3 属于相关的数据包,这一步就过滤掉数据包 t1.A1。

【StoneDB Class】入门第二课:StoneDB整体架构解析

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

  1. 第一步已经过滤掉数据包 t1.A1,这一步就不需要对 t1.B1 和 t2.C1 做关联对比,根据包对包关系的映射表可知,这一步过滤掉数据包 t2.C3 和 t2.C4。那么满足关联条件的数据包有 t2.C2 和 t2.C5。

【StoneDB Class】入门第二课:StoneDB整体架构解析

Min. Max. t2.D1 0 500 t2.D2 101 440 t2.D3 300 6879 t2.D4 1 432 t2.D5 3 100

  1. 第一步和第二步已经过滤掉 D1、D3、D4,那么只剩下 D2 和D5,根据列 D 的 DPN 可知,D5 的最大值100小于 D2 的最小值101,这一步过滤掉数据包 D2。最后只剩下数据包 D5,根据元数据得到 D5 的最小值3。

【StoneDB Class】入门第二课:StoneDB整体架构解析

高性能导入

StoneDB 提供独立的数据导入客户端,支持不同的数据源环境,支持多语言架构。数据在导入前,首先会进行预处理,如数据压缩和知识节点的构建。数据经过预处理后,进入存储引擎无需再次执行解析、数据验证以及事务处理等操作。

于StoneDB的任何问题,都可以加我V咨询:StoneDB_2022 。

Original: https://www.cnblogs.com/yangwilly/p/16596215.html
Author: 来来士
Title: 【StoneDB Class】入门第二课:StoneDB整体架构解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504996/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • git开发常用命令

    1.基本命令git branch 查看本地分支git branch -r 查看远程分支git checkout xxx 切换分支git pull origin master //从…

    数据库 2023年6月9日
    084
  • JDBC概述

    JDBC概述 JDBC(Java DataBase Connectivity),它是一种用于执行 SQL语句的 JavaAPI。通过使用JDBC就可以使用 相同的API访问 不同的…

    数据库 2023年6月16日
    067
  • MySQL视图

    视图 常见的数据库对象 视图概述 为什么使用视图 可以帮助我们使用表中的 部分数据,对其修改可以改变原来表中的值 可以简化查询 控制数据的访问(权限) 视图的理解 视图是一个本身没…

    数据库 2023年5月24日
    062
  • Docker安装部署Mysql8(以作数据持久化)

    1.创建容器并进行持久化处理 #拉取镜像 docker pull mysql:8.0.20 #启动镜像,用于拷贝配置文件到宿主机 docker run -p 3306:3306 -…

    数据库 2023年6月11日
    096
  • Java 多线程共享模型之管程(下)

    共享模型之管程 wait、notify wait、notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 B…

    数据库 2023年6月16日
    097
  • MySQL–SELECT检索语句

    1、检索单个列 SELECT prod_name FROM products; –上述语句利用 SELECT语句从 products表中检索一个名为prod_name的列。 Vi…

    数据库 2023年6月16日
    082
  • 努力的去帮助他人

    天道运而无所积,故万物成;帝道运而无所积,故天下归;–庄子《天道篇》 知识分享才能成长,财富流动才能更多;努力的去帮助每一个人,自己也会收获更多的快乐;不要为生活琐事在…

    数据库 2023年6月16日
    079
  • Python接口自动化——文件上传/下载接口

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 我们在做接口自动化测试的时候,经常会碰到 文件上&#x4F20…

    数据库 2023年6月11日
    071
  • 牛客SQL刷题第三趴——SQL大厂面试真题

    结果保留两位小数,并按播放进度倒序排序。 解题思路: 1、播放进度结算 ①、时间差函数,timestampdiff(unit,char(begin-end)) ②、判断,if或者用…

    数据库 2023年6月16日
    066
  • 创建一个Django项目总结

    2022-09-25 首先,要安装好虚拟环境,之后要切换到虚拟环境中,使用的命令 之后,创建一个Django项目使用的命令: 进入到该项目的目录下,创建一个子应用,使用的命令: 其…

    数据库 2023年6月14日
    092
  • 【MySQL】试题 — 31道巩固 SQL 语句的练习题

    1.取得每个部门最高薪水的人员名称先拿出各部门的最高工资,再与(最高工资对应的人员名录表)对接为临时表。 [En] First take out the maximum salar…

    数据库 2023年5月24日
    089
  • 记一次部署系列:grafana配置特定指标进行邮件告警

    { "__inputs": [ { "name": "DS_PROMETHEUS", "label"…

    数据库 2023年6月9日
    061
  • Java中的线程安全与线程同步

    1.为什么需要线程同步 什么是线程安全:指在 被多个线程访问时,程序可以 持续进行正确的处理。 1.1.线程安全问题 案例:通过抢优惠例子说明线程安全问题 public class…

    数据库 2023年6月6日
    079
  • MySQL之事务和redo日志

    事务 事务的四个ACID特性。 Atomicity 原子性 Consistency 一致性 Isolation 隔离性 Durability 持久性 原子性 原子性意味着事务的所有…

    数据库 2023年5月24日
    092
  • 我的JAVA面试题备忘录

    以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。 为什么要记录这些呢? 一方面,我相信,这样做对我自己的技术提升是有帮助的。在…

    数据库 2023年6月6日
    051
  • 关于.net6项目发布到docker(nginx)踩到的一些坑

    开发环境:桌面云系统(无法使用docker desktop),win10系统 后端开发工具:vs2022 数据库:mysql 缓存:redis 队列和事件处理:rabbitmq 前…

    数据库 2023年6月9日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球