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