图库 | 图存储的基础概念

news2024/11/24 14:42:14

前言

图存储的全称叫图数据库存储引擎或图数据库存储层(组件)。在功能层面,它负责图数据库或图数仓的数据的持久化存储。因为存储距离用户层的应用较图计算更为遥远,过往很少有论著会专门讲述图存储环节,但笔者要说的是,图存储是图数据库不可或缺的环节。下面,我将分两篇文章来重点讲讲。


首先要问大家一个问题——目前市场上主流的数据库存储引擎都有哪些呢?

大而化之大概分为两类,一类是基于B-Tree的存储引擎,一类是基于LSM-Tree的存储引擎。此外,当然还有很多其他类型的存储方式,笔者简单地罗列一下:

  • 基于文件的,有序或无序的
  • 基于堆的,(也是一种文件)
  • 基于哈希桶的
  • 基于索引顺序存储(ISAM)文件系统的
  • 其他的存储模式

那么,如果是按照数据存储的排列方式,还可以分为:

  • 行存储
  • 列存储
  • KV存储
  • 关联存储

我们知道,B-Tree是一种自平衡的树状、有序数据结构。它最早源自上世纪70年代的波音实验室研究院发明出来的。但B到底到底代表了什么,从来没有定论。那么,B-tree在数据库存储引擎端通常会实现什么功能呢?

  • 保证键排序已支持顺序排序
  • 使用层级化索引来最小化磁盘读操作次数
  • 通过块操作来对插入和删除进行加速
  • 通过递归算法来保持索引平衡性

B-tree可以让数据查找、顺序访问、插入及删除等操作的时间复杂度对数时间内。实际上,工业界的B-tree索引通常都采用辅助索引的方式来进行加速。我们熟知的很多关系型数据库例如Oracle、SQL Server、IBM DB2、MySQL InnoDB、PostgreSQL到B-tree的身影。

LSM-tree的全称是Log-Structured Merge-Tree(日志结构化合并树),它诞生的背景是大数据情况下快速增长的数据,数据量日益增大,写操作较之前的关系型数据库更为频繁,非关系型数据库快速崛起,这些新兴的数据库和大数据框架更多的用于分析和决策支撑。它设计之初的目标就是提供对磁盘文件的高写入性能索引。

我们知道,与LSMT相关的论文最早是上世纪的90年代初,在加州的DEC公司由帕特里克·奥尼尔等人在进行数据库研发时发明的,并最终于1996年发布。今天几乎所有的NoSQL数据库实现中都可以看到它的身影:

  • Bigtable
  • HBase
  • LevelDB
  • SQLite
  • RocksDB
  • Cassandra
  • InfluxDB
  • ScyllaDB
LSMT的发展历史

LSMT的设计理念用最简单的语言描述是构造了两套大小不同的树状数据结构。它展现给我们最核心的理念是:分层存储加速!充分利用内存加速,当内存空间不够的时候再利用硬盘加速,特别是随着新型存储硬件,例如SSD、NVMe-SSD、持久化内存PMEM的不断发展,LSMT的理念至今为止可谓长盛不衰。

LSMT并非没有缺点,实际上它相比与B-Tree而言有两个问题:

  • 读性能瓶颈(CPU资源消耗更高)
  • (更高的)读以及空间放大效果(占用更多内存、硬盘空间)

当然,在实际应用中,LSMT与B-Tree通常是同时被使用的。并且,LSMT的读性能问题通过布隆过滤器(Bloom Filter)得到了大幅提升。对Bloom Filter有兴趣深入研究的读者可以尝试阅读这篇文章What are Bloom filters? https://blog.medium.com/what-are-bloom-filters-1ec2a50c68ff。

我们花了不小的篇幅介绍了“传统”数据库的存储引擎。现在,我们来剖析一下图数据库的存储引擎的原理。


图存储与图计算组件在图数据库框架内的层级逻辑关系

​上图中就是图存储引擎、计算引擎、数据管理、操作管理等组件有机的结合成为一个相对完整的产品时的样子。

之前的文章中,笔者就介绍过图数据库的计算引擎数据结构,这些数据在逻辑上都是源自持久化存储的数据,或者需要与存储引擎保持某种一致性,以实现数据库的事务正确性(即ACID,原子性、一致性、隔离性与持久性对应的四个英文单词的首字母)。

图的存储无非是最主要的两种基础数据结构——顶点和边,其他所有数据结构都是在这两者的基础上衍生而来的,例如各类索引、中间、临时的数据结构,用来实现查询与计算加速等,以及那些需要异构返回的数据结构,如路径、子图等。

  • 顶点

支持点、边结合的数据类型如果是完全静态的,也就是说点或边的数量不会变化,不会增加、减少或更新,也不会发生它们各自属性的变化,那么映射到文件系统上的数据结构就可以作为图存储的核心数据结构。

如果真是这样的话,我们可以复用传统数据库的存储引擎,例如MySQL的InnoDB或MyISAM(ISAM的变种)引擎,更有甚者,只使用磁盘文件就可以支持静态的图数据库。然而,效率在大多数情况下是不可或缺的。上面“静态”数据的假设在商业场景中是极少成立的,因为无论是交易系统还是业务管理系统,数据都是动态的、流动的。任何贴近真实业务场景的系统都需要支持对数据(存储引擎)的更新操作。因此,图存储引擎的架构设计中有一对重要的概念:非原生图与原生图。所谓非原生图是指它的存储与计算是以传统的表结构(行或列数据库)的方式进行的;而原生图则采用更能直接反映关联关系的方式构造而成,也因此会有更高效的存储和计算效率。

  • 非原生图
  • 原生图

如果用关系型数据库MySQL、宽列数据库(wide-column)HBase或二维的KV数据库Cassandra来作为底层存储引擎,也可以把点、边数据以表(或列表)的方式存储起来,它们在进行图查询与计算时的逻辑大体如下图所示。


非原生图(关系型、SQL类数据库)存储查询模式示意图

举个例子,查询某位员工隶属于什么部门,返回该员工姓名、员工编号、部门名称、部门编号等信息。用关系型数据库来表达,这个简单的查询要涉及3张表之间的关联关系:员工表、部门表和员工部门对照表。

整个查询过程分为如下几步:

  • ①在员工表中,定位007号员工;
  • ②在对照表中,定位007号员工所对应的全部部门ID;
  • ③在部门表中,定位步骤②中的全部ID所对应的部门名称;
  • ④组装以上①~③步骤中的全部信息,返回。

我在上已经介绍过数据库存储加速的概念,上面每个步骤的时间复杂度如下表所示:

SQL查询复杂度

上面的查询(时间)复杂度并没有考虑任何硬盘操作的物理延迟或文件系统上的定位寻址时间,实际的时间复杂度在这样简单的一个查询操作中,如果数据量在千万以上,可能会以分钟计。如果是更复杂的查询,涉及多表之间复杂的关联,则可能会出现多次扫表操作,试想在硬盘上这个操作的复杂度和时延会是何等量级。如果用原生图的“近邻无索引”模式来完成以上查询,整个流程如下图所示。

原生图的查询逻辑示意图

​在原生图上的查询步骤细分如下:

  • ①在图存储数据结构中定位员工;
  • ②从该员工顶点出发,通过员工-部门关系,找到它所隶属的部门;
  • ③返回员工、员工编号、部门、部门编号。

以上第一步的时间复杂度与非原生图(SQL)基本相当,但是第二步会有明显的缩短。因为近邻无索引的数据结构,员工顶点通过3条边直接链接到3个部门。如果SQL查询的方式最优解是O(35),原生图则可以做到O(8),分解如下表所示。


原生图查询复杂度

以上的例子显示,原生图与非原生图在事件复杂度上存在较大的性能差异。以较简单的1度(1-Hop)查询为例,有330%的性能提升。如果是更为复杂、深度更大的查询,则会产生乘积的效果,也就是说随着深度增加而性能差异指数级飙升,如下表所示。


非原生图VS.原生图性能落差示意图

(文 / 孙宇熙 Ricky 业界知名高性能计算与存储系统专家、大数据专家、图数据库专家及学者。 )

·End·

预告:这期我们就图查询的基本概念讲了讲,下期我们再围绕图存储的数据结构与构图聊聊。当然,有兴趣的读者,也可以看我发布的新书——《图数据库原理、架构与应用》,里面有更详尽的内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python搭建虚拟环境

一、简介 1.特点: python的虚拟环境类似于虚拟机,能够创建一个独立的python运行环境, 虚拟环境中的安装的第三方依赖包和全局环境中的包相互独立。 2.环境 1. python3.3以上版本(自带venv模块,若已安装则可直接改变环境变量来…

【软件安装】Linux中RabbitMQ的安装

① 本篇是基于Linux操作系统中的安装,故先准备一个干净的Linux操作系统。本文中所有的操作基于CentOS8进行安装演示; ② 接下来的演示文本中,红色字体为操作步骤,黑色字体为解释说明; ③ 确保Linux系统中已经安装好必…

LightGBM 实现基于内容的个性化推荐

大家好,本文中,我将和大家一起学习如何训练 LightGBM 模型来估计电子商务广告的点击率的推荐系统的例子。将在Criteo数据集上训练一个基于LightGBM的模型。 LightGBM是一个基于树的梯度提升学习算法框架。是基于分布式框架设计的,因而非常高…

汇川伺服电机位置控制模式参数配置

1. 基本控制参数设置 1)设置位置控制模式 2)绝对值位置线性模式 2.端子输入参数设置 1)将输入端子使能失效 3. 位置控制参数设置 1)将位置来源设置为2:多段位位置指令 4.通信参数设置 1)波特率设置为960…

单元测试我们需要知道哪些?

前言趁着刚读完《认知天性》这书,书有一点这样说:「我们学习行为更多凭着直觉,即使我们已经看到了科学数据,但我们也不愿意去相信自己的直觉存在问题。」那和我们单元测试有什么关系呢?这时我突然有一个问题&#xff1…

19-28-hive-数据类型-DDL

19-hive-数据类型-DDL: 基本数据类型 Hive 数据类型Java 数据类型长度例子TINYINTbyte1byte 有符号整数20SMALINTshort2byte 有符号整数20INTint4byte 有符号整数20BIGINTlong8byte 有符号整数20BOOLEANboolean布尔类型,true 或者falseTRUE FALSEFLOAT…

【Python】Labelme/PIL读取图片朝向错误解决

文章目录一、问题背景二、产生原因三、解决方案一、问题背景 发现使用labelme直接读取含imageData(将图片bytes数据使用base64编码后的str数据)的json文件时,读上来的图片会发生自动旋转的问题。比如原先是横放的图,读进来后就成…

虚拟化基本知识及virtio-net初探

QEMU/KVM是在Linux中被广泛使用的虚拟化技术之一,而virtio作为一个半虚拟化I/O事实上的标准[1],是QEMU/KVM在I/O虚拟化部分的默认实现。virtio-net是virtio标准中的网卡设备,被广泛应用。本文将会沿着虚拟化,virtio半虚拟化I/O&am…

非对称风险模型

推荐模型:非对称性风险,让自己置身于一个好结果比坏结果影响大得多的环境中 比如投资,将85%~90%投入到极低风险的资产中(国债),来享受确定性收益;剩下的投入的10%~15%投入到极高风险资产中&…

使用FeatureTask多线程优化in,提高查询速度

场景是这样的:使用in查询数据的时候,in的数量越多,效率越低,所以一个优化的思路是,缩小in查询的数量,用多线程的方式查询缩小数量后in的sql,并行查询。 直接上代码: public List&l…

Linux零基础入门(四)Linux实用操作

Linux零基础入门(四)Linux实用操作前言Linux实用操作一 各类小技巧(快捷键)1 ctrl c 强制停止2 ctrl d 退出或登出3 历史命令搜索4 光标移动快捷键5 清屏二 软件安装1 Linux系统的应用商店2 yum命令3 apt命令 - 扩展三 systemct…

全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么

全光谱台灯是指灯光色谱丰富度与太阳光一般全面的台灯,这样的灯光照射下的任何物体,不但颜色丰富多彩,而且极其真实,无限接近太阳光下的真实色彩,对人眼舒适度有巨大的提升,所以全光谱台灯不但对孩子无害&a…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

算法实操:Python代码实现直插排序(含有序在前有序在后)

【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长&a…

[附源码]SSM计算机毕业设计音乐网站JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

用结构体解决实际问题中构造数据类型

用结构体解决实际问题中构造数据类型。 实验内容 (1)题目:编写input()和output()函数输入,输出5个学生的数据记录。学生数据定义如下: #define N 5struct student{ char num[6];char name[8];int score[4];} stu[N];…

anaconda安装paddle(安装CUDA,CUDNN)

前言 为什么会写这样一篇呢,应该早晚会用到paddlelite,所以paddle还是要学的,与其在飞桨平台上跑,不如在自己电脑上跑。我以为安装paddle只需要三行代码: # 打开Anaconda Prompt conda create -n paddle python3.9 c…

C++异常及异常优缺点

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、C语言传统的处理错误的方式二、C异常1.throw catch2.异常的抛出和捕获3.异常的抛出和捕获原则4.函数调用链 异常 栈展开匹配原则5.异常的…

微信小程序怎样开发?【小程序开发】

说到微信小程序,很多公司企业商家都会有自己的微信小程序,已经是他们的标配了。那么还没有自己的微信小程序的小伙伴,也在筹备着开发小程序。那么微信小程序怎样开发的呢,今天就教大家一个比较简单的开发方法。 微信小程序怎样开…

Linux进程通信之共享内存

一、共享内存之原理 1.是在物理内存中开辟了一片空间; 2.不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间之中 3.不同的进程可以通过操作自己的虚拟地址空间中的虚拟地址去操作共享内存(物理地址) 共享内存是最快的进程之间…