华为数据:超全总结,详细说明九个数据存储引擎及相应的数据结构

智聪说说网
智聪说说网
智聪说说网
43262
文章
0
评论
2023-03-0900:26:41 评论 6

【摘要】 常见的存储算法结构包括:哈希存储,B 、B 、B*树存储,LSM树存储引擎,R树木、倒排索引、矩阵存储、对象与块、图形结构存储等。

存储引擎是存储系统设计中的底层数据结构,直接决定了存储系统所能提供的性能和功能。常见的存储算法结构包括:哈希存储,B 、B 、B*树存储,LSM树存储引擎,R树木、倒排索引、矩阵存储、对象与块、图形结构存储等。

哈希存储引擎是哈希表的持久实现,通常用于键值类型的存储系统。大多数传统的关系数据库使用索引来帮助搜索数据,以加速对数据库数据的访问。考虑到经常需要范围搜索,树型结构一般用于索引。譬如MySQL、SQL Server、Oracle数据存储和索引的基本结构是B-树和B 树。

主流的NoSQL数据库采用日志结构合并树(Log-structured Merge Tree)组织数据。LSM 像B树一样,树存储引擎支持增加、删除、更改、随机读取和顺序扫描。通过批量存储技术,大大改善了磁盘的随机写入问题IO性能广泛应用于后台存储系统,如Google Big table、Level DB,Facebook Cassandra系统,开源的HBase,Rocks dB等等。

哈希存储的基本思想是关键字Key对于自变量,通过一定的函数关系(散列函数或哈希函数)计算相应的函数值(哈希地址),并将数据元素存储在相应地址的存储单元中。然后根据要找到的关键字使用相同的函数计算哈希地址,然后直接到相应的存储单元去找到要找到的数据元素。代表用户包括Redis,Memcache,以及存储系统Bitcask等。

基于内存Hash,支持随机增删改查,读写时间复杂O(1)。但不能支持顺序读写(指典型的Hash,不包括如Redis基于跳表的ZSet其他功能)性能最好,无需有序遍历。

构建哈希函数的一般原则是将关键字集合空间尽可能均匀地映射到地址集合空间,同时尽可能降低冲突的概率。

l 除剩余数法:H(Key)=key % p (p ≤ m)p最好选择一个小于或等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等m最大素数(哈希地址集合的数量)。

l 直接地址法: H(Key) =a * Key b;“a,b”是常量。

l 数字分析法

比如有一组key1=112233,key2=112633,key3=119033分析数中间两个数波动,其他数不变。那么取key值可以是 key1=22,key2=26,key3=90。

l 平方取中法

l 折叠法

比如key=135790,要求key散列值为2位数。那么将key变为13 57 90=160,然后去掉高位1key=60。

1) 开放地址法

如果两个数据元素的哈希值相同,则在哈希表中为后插入的数据元素选择另一个表项。当程序搜索哈希表时,如果没有在第一个相应的哈希表项中找到符合搜索要求的数据元素,程序将继续搜索,直到找到符合搜索要求的数据元素或遇到空表项。

①.线性探测法

这种方法在解决冲突时,依次探测下一个地址,直到有空的地址后插入,若整个空间都找遍仍然找不到空余的地址,产生溢出。Hi =( H(Key) di ) % m ( i = 1,2,3,...,k , k ≤ m-1 )

地址增量 di = 1,2,..., m-1, 其中 i 为探测次数

②.二次探测法

地址增量序列为: di= 1^2,-1^2,2^2,-2^2 ..,q^2,-q^2 (q≤ m/2)

Python字典dict利用二次探索来解决冲突。

③.双哈希函数探测法

Hi =( H(Key) i * RH(Key) ) % m ( i=1,2,3,..., m-1)

H(Key) , RH(Key) 是两个哈希函数,m哈希表的长度。首先用第一个哈希函数对关键字计算哈希地址。一旦发生地址冲突,移动的步长因子将用第二个函数确定,最后通过步长因子序列找到剩余的哈希地址。H1= (a b) % m, H2 = (a 2b) % m, ..., Hm-1= (a (m-1)*b) %m

2) 链地址法

将哈希值相同的数据元素存储在链表中,在搜索哈希表时,必须采用线性搜索方法。

Hash存储示例

假设散列存储的线性表为(32、75、29、63、48、94、25、46、18、70),散列地址空间为HT[13]采用除余数法构造散列函数和线性探测法处理冲突。

B树存储引擎是B树的持久实现,不仅支持单个记录的增加、删除、阅读和更改操作,还支持顺序扫描(B 树叶节点之间的指针)。

B树存储引擎是B树的持久实现,不仅支持单个记录的增加、删除、阅读和更改操作,还支持顺序扫描(B 树叶节点之间的指针)。与哈希存储引擎相比,B树存储引擎不仅支持随机读取,还支持扫描范围。Mysql的MyISAM和InnoDB支持B-树索引,InnoDB还支持B 树索引,Memory支持Hash。

B-树是一种多路平衡搜索树,与红黑树最大的区别在于,B从几个到几千个,树的结点可以有多个子节点。B树类似于红黑树,含n个结点的B树的高度也是O(lgn),但由于其分支因素较大,它的高度可能远小于红黑树。所以B树可以在那里O(logn)实现各种动态集合操作,如插入、删除等。

B-树的规则定义:

1) 任何非叶节点最多可以有M个儿子节点;M>2;

2) 根节点的儿子数为:[2,M];

3) 除根节点为的非叶子节点的儿子书为[M/2,M];

4) 至少存储每个结点M/2-1(取上整,最多M -1 关键字;(至少2)

5) 非叶结点的关键字数 = 指针书指向子节点 -1;

6) 非叶节点关键词:K[1],K[2],K[3],…,K[M-1;且K[i]< K[i 1];

7) 非叶结点指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]子树,P[M]指向关键字大于K[M-子树,别的P[i]指向关键字属于(K[i-1], K[i])的子树;

8) 所有叶结点位于同一层;

下图是M为3B-树:

B-树的搜索

从根结点开始,对结点中的关键字(有序)序列进行二分搜索,如果命中则结束,否则,进入查询关键字范围内的儿子结点;重复,直到相应的儿子指针是空的,或是叶结点;

B-树的特性

关键字集合分布在整棵树上,任何关键字出现,只出现在一个结点;

所有结点都存储数据,搜索可以在非叶结点结束;

搜索性能相当于在整个关键字集中进行一次二分搜索。查询时间的复杂性不固定Key与树的位置有关,最好是O(1);

存储非叶节点data当数据量很大时,树的层数可能会相对较高,随着数据量的增加,IO次数控制不如B 树优秀。

MongoDB 存储结构

MongoDB而且是聚合数据库B-树恰好Key和data域聚合在一起,所有节点都有Data域,只要找到指定索引就可以访问,单次查询的平均速度无疑比MySql。

MongoDB它不是传统的关系数据库,而是基于Json存储格式NoSQL,目的是高性能、高可用性、易扩展。

MongoDB它不是传统的关系数据库,而是基于Json存储格式NoSQL,目的是高性能、高可用性、易扩展。

B树在改善磁盘IO性能并没有解决元素遍历效率低下的问题。要解决这个问题,B 树木应运而生。B 树是B树的变形,本质上是多路平衡找树。B 树只要遍历叶节点,就能实现整棵树的遍历。而且基于数据库范围的查询非常频繁,B树不支持这种操作(或者效率太低)。RDBMS需要B 树木用于减少寻道时间,顺序快速访问。

B 树通常用于数据库和操作系统的文件系统。像NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS使用等文件系统B 树作为元数据索引。B 该树具有保持数据稳定有序、插入和修改对数时间复杂性稳定的特点。B 自底向上插入树元素。

下图是一棵树的高度M=3的B 树

空气净化器类型:如何选择空气净化器,详细对比5款高端机型

B 树上有两个头指针,一个指向根节点,另一个指向关键字最小的叶节点,所有叶节点(即数据节点)都是链环结构。因此可以对B 树有两种搜索操作:一种是搜索主键范围和分页,另一种是从根节点随机搜索。

与普通B-树相比,B 树的非叶节点只有索引,所有关键词都位于叶节点,这将使树节点的程度相对较大,树的高度相对较低,有利于提高查询效率。叶节点上的数据将形成有序链表。

主要优点如下:

结构扁平,高度低(一般不超过4层),随机通道次数少;n棵子树的结点含有n个关键词,不用于保存数据,只用于索引。其子树(根结点)中最大(或最小)关键词仅包含在结点中。数据存储密度高,位于叶节点,查询稳定,遍历方便;叶节点存储值按值排序,形成有序链表,区间查询转换为顺序读取,效率高。而且所有点与根节点的距离相同,因此任何查询效率都非常相似。B树必须通过中序遍历进行支持范围查询。与二叉树不同,B 树的数据更新操作不是从根节点开始的,而是从叶节点开始的,树在更新过程中可以以相对较小的成本实现自平衡。B 树的缺点:如果写入的数据相对离散,那么在寻找写入位置时,子节点很可能不在内存中,最终产生大量的随机写入,性能下降。下图说明了这一点。

B 树在查询过程中不应该慢,但如果B 树已经运行了很长一段时间,写了很多数据,随着叶节点的分裂,相应的块将不再存储和分散,可能导致原始连续数据实际上存储在不同的物理磁盘位置,然后执行范围查询将成为随机读取,将导致更高的磁盘IO,效率降低。

例如,当数据更新或插入完全无序时,如先插入0,然后8000,然后200,然后66666。当跨度较大的数据不在磁盘中时,您需要首先找到该数据。数据非常离散,这意味着每次搜索时,其叶节点可能不在内存中,此时性能瓶颈将出现。而随机写下子树的分裂,产生大量的磁盘碎片,也是不友好的一面。

可见B 在多读少写的情况下,树有优势。当然,可用SSD读写速率翻倍,但成本相对较高。

B 树 的搜索

{n}{n}

  与B-树基本相同,区别是B+树只有达到叶子结点才命中(B-树可在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找。

{n}{n}

  B+树的特性

{n}{n}

  非叶子结点相当于是叶子结点的索引

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,多谢。

标签:华为数据:超全总结,详细说明九个数据存储引擎及相应的数据结构

智聪说说网
  • 本文由 发表于 2023-03-0900:26:41
  • 转载请务必保留本文链接:https://www.zhicongwang.com/108708.html