基于LSM的Key-Value数据库实现稀疏索引篇

上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢复从而避免了数据的丢失。
目前此基于LSM的数据库还有三大坑:
1、索引问题
2、SSTable合并问题
3、单机版本问题;
本篇文章将解决其中的一个坑, 索引问题

索引问题

到目前为止还没有详细解释当前系统的索引问题到底是什么,不解决会导致什么问题;目前系统在写入数据将数据持久化到SSTable文件并写每一个SSTable文件对应的索引数据时是为每个数据项Key都记录了相应的索引数据,此时的索引为 全量索引
全量索引就会导致索引文件快速增大,索引文件过大后维护的性能、查询性能就会大幅下降;索引此时需要解决索引文件快速增大问题;这里引入了: 稀疏索引,稀疏索引也是业内比较常见,普遍用到的数据结构;下面详细介绍对比全量索引与 稀疏索引的区别;

基于LSM的Key-Value数据库实现稀疏索引篇

全量索引树为每个key存储对应的key在数据文件中的起始位置、数据项长度,导致其索引结构无比庞大;

基于LSM的Key-Value数据库实现稀疏索引篇

经过优化,此稀疏索引树结构每隔指定间隔才存储一个索引项;
存储的数据为每个间隔区间的所有key数据,Key为该批的第一个key,值为此批次的:起始位置、批次数据项长度,使得索引结构容量大大减少;
本图为间隔两个Key存储一个索引;

节点AAA: 存储AAA、CCC数据索引
节点DDD: 存储DDD、EEE数据索引
节点HHH: 存储HHH数据索引
节点FFF: 存储FFF、GGG数据索引

索引查询

此时稀疏索引的存储结构方式已经解决,在查询与之前也有不少区别;
全量索引:使用key在索引树查找对应数据项,根据索引存储的start、length去对应的数据文件读取相应的数据;
稀疏索引:在索引树中查找最后一个小于所查询key的key节点、第一个大于所查询key的key节点,使用该节点存储的start、length去对应数据文件读取相应的数据块,从中对比查找出所查询的key;

经过此次索引结构的优化,又填了一大坑,还有两大坑待解决:
1、SSTable合并问题
2、单机版本问题;

文章首发地址:https://mp.weixin.qq.com/s/YyXoePq7FamfnfRg0K6-yA

Original: https://www.cnblogs.com/softlin/p/15943529.html
Author: AiFly
Title: 基于LSM的Key-Value数据库实现稀疏索引篇

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516430/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • go语言标准库

    学习go 语言,如果不知道标准库,那很多能力就不知道,标准库应该是程序员可以背下来的 bufio bytes container crypto database debug enc…

    Go语言 2023年5月29日
    061
  • golang的defer踩坑汇总

    变量捕获 defer中的变量会被提前捕获,后续的修改不会影响到已捕获的值,举个例子: 结果defer语句中打印的值是修改前的值。: 最后输出值: 10 Defer运行值: 0 变量…

    Go语言 2023年5月25日
    060
  • Go Micro Dashboard – 实现细节(一)

    前言 Go Micro Dashboard是基于go-micro和ng-alain开发的, 它既是go-micro开发过程中的工具,也可以作为学习go-micro的实际案例。接下来…

    Go语言 2023年5月25日
    081
  • Golang Zap日志

    Zap日志解析 Config.yaml zap: level: ‘info’ #日志级别 format: ‘console’ #输出的级别,有console和json prefix…

    Go语言 2023年5月25日
    073
  • Go 简单入门

    GO的环境配置? GOPATH GOROOT 都是干嘛用的? 配置环境跟java对比有点奇怪 https://blog.csdn.net/weixin_40563757/artic…

    Go语言 2023年5月25日
    078
  • 使用Go http重试请求

    原文连接:https://www.zhoubotong.site/post/78.html开发中对于http请求是经常遇到,一般可能网络延迟或接口返回超时,对于发起客户端的请求, …

    Go语言 2023年5月25日
    062
  • Go语言之Goroutine与信道、异常处理

    一、Goroutine Go 协程可以看做成一个轻量级的线程,Go 协程相比于线程的优势: Goroutine 的成本更低大小只有 2 kb 左右,线程有几个兆。 Goroutin…

    Go语言 2023年5月25日
    065
  • 新作:轻量级Golang IoC容器——iocgo

    习惯于Java或者C#开发的人应该对控制反转与依赖注入应该再熟悉不过了。在Java平台有鼎鼎大名的Spring框架,在C#平台有Autofac,Unity,Windsor等,我当年…

    Go语言 2023年5月25日
    080
  • Badger简单使用

    badger 是 dgraph 开源的 LSMTree 的 KV 引擎,它相比 leveldb 有 KV 分离、事务、并发合并等增强,是 go 生态中比较生产级的存储引擎了。 要开…

    Go语言 2023年5月25日
    074
  • 《Go语言圣经》 读书笔记与个人思考 ① 第一章、包括源码分析

    《The Go Programming Language》 知识点记载,学习笔记、章节练习与个人思考。前言 · Go语言圣经 (itsfun.top) 标题后标记了小丑符号的表示还…

    Go语言 2023年5月25日
    085
  • Go语言之接口

    接口就是一系列方法的集合(规范行为) 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,规范子类对象的行为。 在 Go 语言中的接口是非侵入式接口(接口没了,不影响代码…

    Go语言 2023年5月25日
    063
  • TCP粘”包”问题浅析及解决方案Golang代码实现

    一、粘”包”问题简介 在socket网络编程中,都是端到端通信, 客户端端口+客户端IP+服务端端口+服务端IP+传输协议就组成一个可以唯一可以明确的标识一…

    Go语言 2023年5月25日
    062
  • 流量管制-令牌桶与漏桶

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Go语言 2023年5月25日
    062
  • go语言异常处理

    go语言异常处理 go语言引入了一个关于错误错里的标准模式,即error接口,该接口的定义如下: type error interface{ Error() string } 对于…

    Go语言 2023年5月29日
    066
  • 化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07

    函数是基于功能或者逻辑进行聚合的可复用的代码块。将一些复杂的、冗长的代码抽离封装成多个代码片段,即函数,有助于提高代码逻辑的可读性和可维护性。不同于Python,由于 Go lan…

    Go语言 2023年5月25日
    050
  • Go xmas2020 学习笔记 01-14 上篇

    课程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com) 主讲老师 Matt …

    Go语言 2023年5月25日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球