树形结构

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+树中,叶子节点的每一个节点都有指向下一个叶子节点的指针,从而使遍历获取排序更加方便快捷。

注意:再mysql中使用B+树的索引类型的时候,如下的操作需要引起注意:

  • 使用‘=’的时候索引有效。
  • 使用模糊查询‘str%’的时候,索引有效。
  • 使用group by索引有效
  • 使用order by索引有效
  • 使用in的时候,索引有效
  • 使用not in 的时候,索引无效
  • 使用!=的时候,索引无效
  • 使用范围查找的时候,索引有效
  • 使用is null的时候,索引无效
  • 前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
  • 不适合键值较少的列(重复数据较多的列)也会让索引失效
  • 使用or也会让索引失效
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引

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.对于冗余数据,通常需要做数据文件合并、垃圾回收等操作。

注意:再mysql中使用HASH的索引类型的时候,如下的操作需要引起注意:

  • 使用‘=’的时候索引有效。
  • 使用‘!=’的时候索引有效。
  • 使用order by索引无效
  • 使用in的时候,索引有效
  • 使用范围查找的时候,索引无效

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文件索引做两级索性,优化了查询效率。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值