哈希索引
假如数据库存储全部采用追加式文件组成,可以用key表示键值,value标识偏移量来组成索引。
如果一直追加到一个文件,可能会用尽磁盘,所以需要将日志分解成一定大小的段,当文件达到一定大小的时候就关闭它,并将后续文件写入新段中。可以在之前的段上执行压缩,即丢弃多余的键,只保留最每个键的最新值。
冻结的段合并和压缩过程由后台控制。
哈希索引局限性:
- 哈希表必须全部放入内存,如果有大量的键,则需要把哈希放入磁盘,就会造成随机磁盘IO访问,效率很低。
- 区间查询效率低。
- 合并段的时候更高效,可以使用类似于归并排序算法,产生新的案件排序的合并文件段
- 在文件中查找特定键时,不需要保存整个哈希表,可以用稀疏索引,几千个字节用一个键就够了
- 读请求需要扫描范围内多个k-v对,可以考虑将记录保存到一个块中并压缩,然后稀疏索引指向开头,以减少IO。
工作流如下:
- 写入时,先保存到内存中的平衡数据结构中(如红黑树)
- 内存表大于某个阈值时,将其作为SSTable文件写入(顺序写入),并生成一个新的内存表
- 处理读请求,先尝试内存表,然后最新的磁盘段文件,然后次新的段文件
- 后台进程周期性的执行段合并与压缩,丢弃被覆盖或者删除的值
- 查找不存在的数据时,可能要回溯到最旧的文件,可以用布隆过滤器筛选
- 大小分级、分层压缩
优化
- 通过预写日志(WAL)的方式存储数据库的操作,防止系统崩溃时数据丢失。
- 保存键的缩略信息
- 顺序存储页
LSM读取性能较弱,当磁盘执行压缩操作时,容易发生读写请求等待,较高百分位数相应时间可能会很高。不限制写入速率可能会出现合并速率跟不上写入速率从而造成磁盘空间不足。
推荐阅读
- 科普达人丨漫画图解什么是eRDMA()
- 基于 K8s 的交付难题退退退!| 独家交付秘籍(第三回)
- Java基础|Java基础.Java编译过程
- Netty保姆级入门教程
- C++编程学习指导|C++初阶(初识模板和泛型编程)
- 【连载】说透运维监控系统01-监控系统概述
- 毕业设计|SpringBoot+Vue项目旅游信息推荐系统【源码开源】
- MFIN6003 Derivative Securities
- COMP4500问题