常见存储数据结构

常见存储数据结构

最近在看存储和数据库方面的书籍,遇到了多种数据结构,做个简单总结,有任何理解问题也请大佬明示。╮( ̄▽ ̄)╭


B+树

这里写图片描述
B+tree常用于多种数据库存储引擎中,它是B tree(一种自平衡的树状数据结构)的变种,区别在于非叶子节点不存储实际数据信息。mysql Innodb的聚集索引也使用了这种数据结构,以支持随机读写、范围扫描、排序等特性,同时由于其高度相对低(一般为2-3)可以有效减少io次数,提高读取效率。相对于hash存储引擎,它能支持like (str%)的索引扫描。
1.B+树中,所有非叶子节点的内部节点数量相等。
2.B+树种,非叶子节点不存储实际的数据信息,只存放节点信息。在innodb的聚集索性中,通过这种数据结构能减大大提高非叶子节点的节点存贮的信息量。Innodb按page存放树的每个节点,page默认为16kb,若每个非叶子节点的内部节点长度为20字节,带数据的叶子节点每个内部节点长度为100字节。则一个高度为3的B+树可以存放(16*1024/20)^2(*16*1024/100),约1亿条数据。
3.B+树种,查找最大值和最小值十分方便,时间复杂度为o(1),对于随机查找其效率也十分稳定,并且最多读取h-1次磁盘页。
4.在B+树中,叶子节点的每一个节点都有指向下一个叶子节点的指针,从而使遍历获取排序更加方便快捷。


LSM树

这里写图片描述
LSM tree(Log-structured merge-tree)。就是将对数据的写操作增量保存在内存中,达到指定大小后将这些操作批量写入磁盘,读取的时候需要合并磁盘中的历史数据和内存中的最近写操作。LSM树规避了磁盘随机写的问题,但是读取时候需要访问多个数据文件。
1.通常LSM在写入时会记录日志到磁盘中然后写入内存,防止数据丢失。
2.在从内存同步到磁盘的过程中,会先对数据进行分组排序,然后写入文件系统中。
3.数据文件会在一定条件下触发合并操作,按主键迭代出所有记录,抛弃掉没有价值的,否则生成到新的数据文件中。
4.通常数据文件的索引信息会常驻内存,加速查找,减少磁盘io。


HASH

这里写图片描述
HASH作为一种常见的数据结构,其对应的存储系统被称之为键值(Key-Value)存储系统。应用该数据结构的应用包括redis、memcache、Bitcask、Amazon Dynamo等。使用该数据结构可以极快的检索到所需的数据,使用这种数据结构能带来良好的性能提升。
1.通常这类存贮系统只支持=、!=、IN等查询操作,对范围查找,排序则无法支持。
2.该类引擎通常会在hash表里面存贮具体的数据信息、者对应数据信息所在数据文件的序号、位置、长度等信息。
3.对于写操作,如果全部数据存贮在内存hash表中,则直接更新内存。如果存贮在磁盘中,则追加一条记录,并更新内存hash表的指向信息。
4.对于冗余数据,通常需要做数据文件合并、垃圾回收等操作。


TSM树

TSM(Time Structured Merge Tree),TSM tree是Influxdb基于LSM tree结构的一中变种。influxdb是目前十分流行的时序数据库,性能良好。由于influxdb中存在的数据保存策略,并且每行数据都有时间戳,TSM tree 针对这些特性做了优化。
1.Shard是influx中重要的特征,TSM文件系统中,每个shard都有自己独立的cache、wal、tsm文件,当需要释放过期数据时,直接释放掉文件系统中对应的shard会比LSM中的删除操作更加高效快捷。
2.TSM中通过元数据、TSM文件索引做两级索性,优化了查询效率。


参考资料

[1]维基百科,LSM tree
[2]维基百科,B+Tree
[3]TMS存储引擎
[4]《大规模分布式存储系统:原理解析与架构实战》杨传辉
[5]《高性能mysql(第3版)》施瓦茨 (Baron Schwartz) / 扎伊采夫 (Peter Zaitsev) / 特卡琴科 (Vadim Tkachenko)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值