Atitit 数据库核心技术index索引技术 btree hash lsm fulltxt

目录

1.1. HASH索引、

1.2. LSM索引  LSM算法(Log Structured-Merge Tree)

1.3. BTREE

1.4. Fulltxt比较  lsm适合高并发的数据写入,btree更适合大量查询

  1. HASH索引

先用最简单索引结构来分析,hash索引,hash是一个非常基本的算法,具体可以看链接。这里列举一个主要利用hash存储引擎的数据库Bitcask,官方文档详细的介绍了其实现原理,简单来说就是这个该数据库在内存中是一种hash表结构,hash结构维护key到文件存储的position,数据仅支持追加操作,所有的操作都是append增加而不更改老数据,数据文件分为新数据文件和老数据文件,老的数据文件只读不写,只有一个数据更新,及活跃数据文件。

这里列举一个主要利用hash存储引擎的数据库Bitcask,官方文档详细的介绍了其实现原理,简单来说就是这个该数据库在内存中是一种hash表结构,hash结构维护key到文件存储的position,数据仅支持追加操作,所有的操作都是append增加而不更改老数据,数据文件分为新数据文件和老数据文件,老的数据文件只读不写,只有一个数据更新,及活跃数据文件。

数据结构如下:

Bitcask在内存中保存了key,value的位置关系,索引关系,key对应数据key, value保存不是实际的数据值,而是保存对应文件的相关信息,从图中可以看到是 file_id, value_sz, value_ops, tstamp,由于内存实际不保存真实数据,所有存储容量就会大大提升。

file_id 代表保存的具体文件id

value_sz 代表value大小

value_ops 代表在文件中具体位置

tstamp 保存时间

然后还有一个点是,该数据实现的高性能是依赖于文件追加的方式,相当于LSM的数据追加,数据增加,删除,更新都是追加操作,形成新的数据版本,老的数据还是会在磁盘上,所以操作对应的io都是顺序io,不会随机访问磁盘,所以写入性能得到了保证,然后对于过期的数据,脏数据,bitcask会定期在后台进行一个merge操作,将inactive的数据清除。对于读操作就不需要过多介绍了,通过key可以直接读取到values_文件位置,性能也能得到保证。

  1. LSM索引  LSM算法(Log Structured-Merge Tree)

引入LSM算法可以保证写入性能的情况下支持还范围排序的。

首先说一下什么是LSM算法(Log Structured-Merge Tree), 最初LSM来自于Google分布式表格系统BigTable的论文,它是bigtables的文件组织方式。目前LSM已经应用到了多种数据库领域,最简单的是LevelDB,然后是facebook针对其更改的Roskdb,后来又产生了带上Hbase, cassandra数据库,在mongdb Wired Tiger也能看到,最近也出现在了MySQL领域,已经被广泛验证的存储引擎方式。

SM会维护一个内存有序的Memtable,在内存中维护这样一个有序的数据结构会很容易,像红黑树,平衡树,当有数据插入是先写入到Memtable保持平衡,有序,当Memtable到达一定大小会触发Merge操作,首先将源Memtable指针赋值给一个不可变的MemTable, 这里叫Immutalbe Memtable,然后会重新生成一个Memtable,

LSM的写操作和Bitcask一样,是通过append log的方式,只是会附加一点需要保持数据在内存中有序,不过插入,更新,删除都还是顺序io,性能会有一定保证。然后后台会定期合并各个sstable,清除不必要数据。这里可能引入的一个性能瓶颈是读取性能,如果是查询一个不存在的key,会先查找Memtable,然后会查询最新的sstable文件,这里会引入一个布隆过滤器来解决该问题,简单来说他能很快的判定某数据集中是否存在某个key。

最后简单来说,在保证一定写入和读取性能的条件下,比hash index的优势在于,提供了有序的数据集,支持了范围查询。

  1. BTREE

上边介绍的hash和lsm都不是最应用广泛的索引,btree才是应用最广泛的数据结构。

B+索引是数据库中最常见,也是使用最频繁的索引结构,下面这里可以通过一些基础数据结构来解释会好一点。

相信大家都了解过一种基础的算法,二分查找法,以有序中点为间隔,使用跳跃式的方式,能快速将一组有序的数据结构中找到需要查找的值。

有序性能提高查询效率,有序性也能给数据库带来支持像范围查询提供条件。

其次为了更好的提升查询性能,我们应该减少树的层级结构,

从这里看出,为了保持内存中树的平衡,维护btree+这样一个数据结构,需要做很多工作,性能会有一定降低,主要是插入,更新,删除都不是上边两种方式,通过append 文件,这里的插入,更新,删除,会查找到具体的内存位置,然后是磁盘位置,进行磁盘数据的更新,这回产生大量的随机IO, 写入,更新,删除,这类型的随机IO会更多。

LSM和Btree由于实现原理的不同,所以不过也都有各有优缺点,LSM由于顺序写,提供更快的写入性能,Btree由于更加平衡,读取性能会更强。

  1. Fulltxt比较  lsm适合高并发的数据写入,btree更适合大量查询

虽然这些年层出不穷的出现了各种数据库,但是其实很多数据库底层的存储引擎还是有很多相似性,可以看到各类存储引擎实现方式应用的场景都有一定的不同,比如hash索引更适合简单的kv存储,适合做缓存,lsm适合高并发的数据写入,btree更适合大量查询的应用场景,所以在实际应用的时候,我们需要考虑我们的应用场景,

Atitit 数据库核心技术index索引技术 btree hash lsm fulltxt目录1.1. HASH相关推荐

  1. 【ES笔记01】ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作

    这篇文章,主要介绍ElasticSearch数据库之index索引.doc文档.alias别名.mappings映射结构的基本操作. 目录 一.索引index相关操作 1.1.创建索引 1.2.查询索 ...

  2. 数据库中的索引技术——哈希索引

    1.哈希索引 哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效.对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值, ...

  3. 数据库系统期末复习I:数据库存储与索引技术

    主要是期末复习,结合了学关系代数的课程加上重新整理了一下之前的 midterm 总结,重新聚焦一些要点,添加了详细的解释和重新理解知识点. 整理了一下方便自己复习. DBMS 模式结构 外模式是模式的 ...

  4. Hash索引和BTree索引区别

    Hash索引和BTree索引区别 Hash仅适用于对等比较(=.>.<.>=.<=.between),而BTree可以支持like模糊查询. 不同的引擎支持不同的索引:Inno ...

  5. MySQL索引的Index method中btree和hash的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在MySQL中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但 ...

  6. mysql index fulltext btree_MySQL btree索引与hash索引区别

    在mysql中,大多数索引(如 primary key,unique,index和fulltext)都是在btree中存储,但使用memory引擎可以选择btree索引或者hash索引,两种不同类型的 ...

  7. MySQL索引的Index method中btree和hash的优缺点

    来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...

  8. 【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(6)

    前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握openGauss数据库 ...

  9. 【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(5)

    前文回顾: 1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 3.如何掌握openGauss数据库 ...

  10. 【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(2)

    前文回顾: 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1) 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2) 如何掌握openGauss数据库核心技术?秘 ...

最新文章

  1. Cempi实战攻略(六)——如何截获到达的短消息
  2. 物理光学4 反射与折射中的一些特殊现象
  3. 得到appd url_AppD方法:Java 9支持
  4. netflix_Netflix Archaius用于物业管理–基础知识
  5. Mysql数据中文乱码问题处理
  6. Oracle FGA审计的使用
  7. 01.00 简单工厂模式
  8. cross_val_score 如何对孤立森林_泸县九中开展 “森林草原防灭火”主题班会活动...
  9. vb利用计算机 鸡兔同笼,VB程序题:利用计算机解决古代数学瓿“鸡兔同笼问题”。即已知在同一笼子里有总数为m只鸡和兔,鸡和兔的总脚数为n只,求鸡和兔各有多少只? VB源码 龚沛曾...
  10. 稳压器及稳压二极管型号对照表
  11. 免费仿站_扒站工具下载-IDM站点抓取
  12. 魂迁光刻,梦绕芯片,中芯国际终获ASML大型光刻机
  13. 盘丝洞服务器维护,2010年8月3日定期维护公告 群雄逐鹿争霸赛
  14. OpenCV 将单通道转换为三通道
  15. 京东数据中心设施运维管理(三)
  16. 张乐:研发效能的黄金三角及需求与敏捷协作领域的实践
  17. 安装office报错
  18. 如何优雅地实现C++编译期多态?
  19. 服务器工业tnt配置文件,各服务器配置(实验步骤整理版).docx
  20. TPS和QPS的区别与联系

热门文章

  1. java轩辕剑天之痕游戏攻略_轩辕剑3外传天之痕攻略 全流程文字攻略(3)
  2. 使用百度统计分析你的网站访问数据
  3. java B2B2C Springboot电子商城系统-eureka详解
  4. Linux乱码和数据库乱码的问题简单排查
  5. SDN/NFV在演进中探寻路径
  6. 原创:微信小程序调用【统一下单】、【支付】、【支付回调】api并处理请求...
  7. 解压文件--linux
  8. doctest使用注意点 -- 省略号的使用
  9. window.print()在页面全部加载完成后才能执行。切记。
  10. 鸟哥的 Linux 私房菜13-- 学习 BASH Shell 咯