读DDIA随笔——day2

112 阅读2分钟

第三章 存储引擎与检索

文章从举例最简单的数据库实现说起,通过简单地追加内容到文件尾部。

  • 如果要提升查找效率,需要引入新的数据结构:索引。即保留一些额外的数据作为路标。

    • 哈希索引:用key存主键,用value存放偏移量。如果写的内容超过文件容量,则进行压缩,比如只保留最新版本的value。
    • 哈希索引也有局限性:必须全部放入到内存中,区间查询的效率不高。随后引出了其他索引结构。
    • 排序字符串表:SSTable,要求每个键在每个合并的段文件只能出现一次,并且按键排序。优点如下:
      • 合并段简单高效
      • 查找特定的键时,不需要在内存中保存所有键的索引。
  • 维护SSTable的方法

    1. 写入时,将排序结构添加到内存中的平衡树数据结构中(例如红黑树)。内存中的树也称为内存表。

    2. 内存表大于阈值时,将作为SSTable文件写入磁盘。在写磁盘的同时,写入可以继续添加到一个新的内存表实例中

    3. 读请求时,首先在内存表中查找键,然后在最新的磁盘段文件,然后是次新的,以此类推直到找到。

    4. 后台进程周期执行段合并和压缩过程,丢弃覆盖或删除的值

    • 该算法也是用于LevelDB和RocksDB上。这两个DB用于嵌入到其他应用程序的key-value存储引擎库
  • 从SSTable到LSM-Tree的演变

    • Log-Structure MergeTree, LSM-Tree,以日志结构的合并树
    • Lucene是es和solr等全文索引系统使用的引擎,也是类似的方法

LSM-Tree算法的性能优化

  • 如果查找不存在的键,要一路从内存表检查到最旧的段文件。

    • 优化方法:使用布隆滤波器
  • 大小分级和分层压缩

    • 大小分级:较新的和较小的SSTables被连续合并到较旧和较大的SSTables,HBase使用
    • 分层压缩:键的内容分裂成多个更小的SSTables,旧数据被移动到单独的层级,LevelDB和RocksDB使用