mysql中lsm树_LSM树理解

mysql中lsm树_LSM树理解对比三种引擎的实现 hash 存储引擎 哈希表持久化的实现 可以快速支持增删改查等随机操作 且时间复杂度为 o 1 但是不支持顺序读取扫描 对应的存储系统为 k v 存储系统的实现 b 树存储引擎是 b 树的持久化实现 不仅支持单条记录的增删改查操作 还支持顺序扫描 对应的存储系统就是 mysql lsm 树存储引擎和 b 树存储引擎 一样支持 增删改查 也支持顺序扫描操作 LSM 牺牲了读性能 提高写性能 LSM 的原

对比三种引擎的实现:

hash存储引擎:哈希表持久化的实现,可以快速支持增删改查等随机操作,且时间复杂度为o(1),但是不支持顺序读取扫描,对应的存储系统为k-v存储系统的实现。

b树存储引擎是b树的持久化实现,不仅支持单条记录的增删改查操作,还支持顺序扫描,对应的存储系统就是mysql。

lsm树存储引擎和b树存储引擎,一样支持,增删改查,也支持顺序扫描操作。LSM牺牲了读性能,提高写性能。

LSM的原理:将对数据的修改增量保存在内存中,达到指定大小限制之后批量把数据flush到磁盘中,磁盘中树定期可以做merge操作,合并成一棵大树,以优化读性能。不过读取的时候稍微麻烦一些,读取时看这些数据在内存中,如果未能命中内存,则需要访问较多的磁盘文件。极端的说,基于LSM树实现的hbase写性能比mysql高了一个数量级,读性能却低了一个数量级。

LSM树原理把一颗大叔拆分成N颗小树,它首先在内存中,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成为一个大叔,用来优化读性能。

d1a94d8782d53d45d7c0b75e701250f8.png

以上就是hbase存储设计的重要思想,这里说明一下:

因为数据是先写到内存中,所以为了防止内存数据丢失,会先把数据写入hlog中,也符合了数据库中标准,先写日志,再写数据

memstore上的树达到一定大小之后,需要flush到磁盘中,然后再定期做合并,提高读取的性能;

关于LSM Tree,对于最简单的二层lsm而言。

fc5915f07894952ff1164a12d8d1619d.png

lsm tree,理论上,可以是内存中树的一部分和磁盘中一层数做merge,对于磁盘中的树直接做update操作有可能会破坏物理block的连续性,在实际场景中,一般lsm有多层,当磁盘中的小树合并成为一个大树的时候,可以重新排好顺序,使block连续,优化读性能。

hbase在视线中,是把整个内存在一定阈值后,flush到disk中,形成一个hfile文件。这个file的存储也是一个小的b+树,因为hbase是存储在hdfs上,hdfs不支持更新操作,所以hbase的数据也是定期flush到磁盘中,而不是和文件中的hfile做合并操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210789.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:54
下一篇 2026年3月18日 下午11:55


相关推荐

  • Midjourney中国版和国外一样吗 国内版mj好还是国外好

    Midjourney中国版和国外一样吗 国内版mj好还是国外好

    2026年3月15日
    5
  • C++ docker_docker部署mysql

    C++ docker_docker部署mysql版权声明:本文为博主原创文章,未经博主允许不得转载。Docker介绍Docker是一个开源的容器引擎,它有助于更快地交付产品。Docker可将应用程序和基础设施层隔离,并且将基础设施当作程序一样进行管理。使用Docker,可以更快地打包,测试以及部署应用程序,并可以缩短从编程到部署运行代码的周期docker部署c/c++程序关于docker的使用网上有很多的教程但是很少有介绍如…

    2022年10月19日
    4
  • Java安全之XStream 漏洞分析

    Java安全之XStream漏洞分析0x00前言好久没写漏洞分析文章了,最近感觉在审代码的时候,XStream组件出现的频率比较高,借此来学习一波XStream的漏洞分析。0x01XSt

    2021年12月13日
    57
  • mybatis 批量删除方式

    mybatis 批量删除方式批量增加 insertid batchSaveUse insertintot user user name sex values 动态 SQL 之 foreach 的用法 collection users 用于指定循环集合的名称 如果接口中并未指定参数别名 那么默认就是 listitem user 用于指定每次循环后的对象的别名 separa insertid batchSaveUse

    2026年3月26日
    1
  • 美元共有几种面值_日元的面值有哪几种

    美元共有几种面值_日元的面值有哪几种美元面值纸币有1美元、2美元、5美元、10美元、20美元、50美元、100美元。以前曾发行过500和1000元面额的大面额钞票,现在已不再流通。美元是美利坚合众国的官方货币。目前流通的美元纸币是自19

    2022年8月4日
    10
  • python_pip国内镜像源

    python_pip国内镜像源1 国内主要镜像源清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 https pypi mirrors ustc edu cn simple 华中理工大学 http pypi hustunique com 山东理工大学 http pypi sdutlinux org 豆瓣 http pypi douban com simple 2 使用

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号