odoo tree视图过滤数据_数据存储结构 LSM Tree PK B TREE (从底层了解数据库设计)...

882903fbbad13e4aa6aad5a26fbbe8b4.png

随着使用数据库的深度和理解能力的提升,有一个问题硬件的提升,与数据量的变化是否对数据库底层的架构有冲击。 我们公认的BTREE B+TREE  是否还能面对现在的硬件的变化。 

BTREE 到底是为那种硬件逻辑来服务的,这点是需要搞清楚的

7207cdef11553153899d25dd86ac93e1.png

在MYSQL 中使用的B+TREE的改进版中底层的数据也是有指针的,便于数据顺序的读取和查找。但在怎样写入一次数据,需要分两次写入,这是B+TREE本身结构所需要的。

在数据的读取中,磁头读取数据的速度是非常快的,纳秒基本上服务器级别的磁盘是可以达到的,但慢在磁头的移动,最近忘记哪家公司了,希捷还是西数发明了双向磁头,宣称数据读取的速度提高了200%. 所以B+TREE 要解决的主要问题就是我们的传统磁盘的性能问题,通过优化数据结构来提高一次数据的尽量不要偏移磁头,一次磁头能读取的数据越多,越准确越好。

10734faa2d82ceba8603e371196536e2.png

所以无论是ORACLE ,SQL SERVER ,PG , MONGODB , MYSQL 的数据块的索引均都支持 B+TREE的类型,并且有点数据库就仅仅有这一种数据结构。

fa8d3433d4fd2b3956bba8a32a5a0374.png

时代不同了,SSD 已经很多年了,虽然价格和传统磁盘相比还是太高,但你敢说你最近两年内买的笔记本上没有他的身影。硬件的变化并不是和部分人想的,仅仅是系统性能的提高,数据的读取的效率提高。 

硬件推动的很可能是某个工作的消失,甚至是某种数据结构的淘汰。例如原先某个SQL 优化的工作,由于更换了更快的CPU ,更大的内存, SSD 磁盘系统,原先很烂的SQL 不在是问题,你优化的“事业”,就此葬送在硬件的更新换代上。

所以害死?的,并不一定是卖猪肉的,很可能是因为牛肉更便宜了。BTREE 是为传统磁盘来服务的,那SSD 磁盘对于 BTREE的方式可能并不感冒,如果你使用的SSD 磁盘, POSTGRESQL 中的某些配置文件中的某些参数都有可能要大动干戈。

5f534c499fad04541c6c0e3492c395e0.png

 Unfortunately, standard disk-based index structures such as the B-tree will effectively double the I/O cost of the transaction to maintain an index such as this in real time, increasing the total system cost up to fifty percent.  Clearly a method for maintaining a real-time index at low cost is desirable.  The Log-Structured Merge-tree (LSM-tree) is a disk-based data structure designed to provide low-cost indexing for a file experiencing a high rate of record inserts (and deletes) over an extended period. 

LSM tree 的目的,上面的截图的文字中,BTREE 会连浪费I/O COST ,所以LSM tree 这样的数据结构为了就是,高并发的写入而准备的。

下面就引入一个Knowledge Sharing, Why  LSM Tree  Fast

c757462f4b8c486cc5a9901d04ba7dfe.png

首先我们需要确认LSM 要解决一个什么问题,更快速的写,更快速的读,并且是大量的数据的情况下。

5d8b567a24562b3913b4001be5df3c14.png

LSM 的主体思想可以这样来表达,数据首先写入到buffer 然后当达到一个阈值的情况下,将数据顺序整理后刷新到磁盘中。(由于在内存中预先整理,所以顺序写的速度,在传统磁盘中也是很快的)

c261dbb36cb8d87a337f49bb577ed19c.png

那这样的情况下,就会产生另外一个问题,读数据的困难,写是有序写入并且有内存进行批量的数据刷新,这放到哪个地方都是提升写性能的一种方式,但数据要被读取的时候,就会产生一个问题,我怎么去找到我的数据。如果顺序的去查找,那将.......

6d4eabb9a7b72eb982a8cffd71515a63.png

那么怎么提升读的性能就是LSM TREE 要考虑的事情,我们可以利用bloom 过滤器,bloom 过滤器常常用在大数据量中的数据排除的活动,这是Bloom 过滤器的特性(之前写过一篇关于bloom 过滤器,应该是和postgresql有关的一篇文字),这里简单的一句话bloom说你要查找的值没有,他一定没有,但如果他说有,有可能是错误,但问题是他的速度是非常快的,所以通过bloom过滤器,加上一个内存buffer 指针(保存实际的数据的物理地址,这里可以理解为index)来进行数据的读取,原则上是可以增加数据的读取的速度和准确度

7b01a1b2a1d0834e78373f970015b540.png

7410d5cbd76d5d6ac5eb1dc768bdf6d8.png

并且在这个期间,是要对磁盘中的文件进行merge的,如何merge 以及 merge的 频率就会直接影响整套系统的,是更偏向于写入的性能还是读取的性能

ba7ffa7382ee1a8f8f6b95a61959e313.png

这里稍微的小结一下,Btree 我们知道,由于数据的插入需要符合B+TREE的原理的,所以一定会有数据的空点(页面会split or merge),但LSM TREE 对数据空间的利用率要比B+TREE 干脆的多。

具体LSM tree 在磁盘上的文件的实现SSTable,相信稍微懂一点cassandra的同学对这个名词是不会陌生的,SSTABLE可以理解为是磁盘驻留的有序不可变数据结构。从结构上看,SSTable分为两部分:数据块和索引块(请看下图),数据块由按键顺序写入的唯一键/值对组成。索引块包含映射到数据块指针的键,这些键指向实际记录所在的位置。索引可能是B-tree,或者散列表来实现查询。SSTable中的每个值项都有一个与之关联的时间戳,标记了插入时间。SSTables是从键到值是持久的、有序的、不可变的映射,其中键和值都是任意的字节字符串

169d719fd2a3faacfa28df0ecd695fb9.png

由于SSTable是不可变的,插入、更新或删除操作将需要重写整个文件,主要它是针对读、顺序写进行优化的,没有预留空间允许任何就地修改,用大白话讲就是这个SSTABLE 的磁盘数据存储的结构,会跟随着数据的变动不停的进行刷新合并操作。所有的Insert 操作还是Insert 操作,所有的UPDATE 操作也可以理解为insert NEW 的操作,delete 的操作也是记录一个标记,在下次文件合并的过程中,会将其去,也可以称这个过程叫压缩。(也就是一KEY VALUE数据会有多个版本)

56cede8c3f0bb732bca028643f8a9e8a.png

此时会重提上面提到的两个问题,1 为什么要有时间戳的概念,时间戳的概念主要是在合并时,如有相同的数据,以时间戳最后的为准 2 合并会增加数据的顺序性,让后面的数据查找更快速。

5e791cfc9f831049d0fff7d75be2f5bd.png

写到这里不能不终止了,因为没有人愿意去看一篇长篇大论,并且毫无乐趣,因为一篇文字是需要点冲突点,来引起人们阅读的兴趣。

那下面的冲突点, LSM TREE 和  BTREE 之间的不同点在哪里

1 BTREE 是固定,一个页面可以从2KB - 32KB大小,具体要和磁盘的结构吻合。

2 LSM TREE 则设计是没有这样固化的概念

1 B+TREE 可以在PAGE 页内部进行修改更新,删除。

2 LSM-TREE 的操作可以理解为 insert  new , append one

1 B+TREE 对数据读取的支持是高效的,尤其对于顺序读的操作,维护B+TREE的操作会不断的分裂和合并,随机的读写的操作的性能随着数据的增加,会降低

2  LSM-TREE 本身写入的特点,支持高容量的高并发的写操作,这是一个分布式系统可能更加看重的,本身读取数据的效率是随着相关索引的优化来进行改变的,理论上读的碎片也可以接近于 B+TREE。

这里就引出了另一个话题,LSM-TREE的合并操作会占用大量的CPU 和I/O ,这难道不会影响系统性能,OK, 所以及回到这篇文字的开头,一个硬件的是可能改变一个数据库的底层架构,让其在某些情况下让某些不可能,变为可能。

ed12a4cd6470208c44028a0fa1117f12.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java s结尾的工具类_FilenameUtils工具类

commons-iocommons-io2.4import java.util.ArrayList;import java.util.List;import org.apache.commons.io.FilenameUtils;import org.apache.commons.io.IOCase;/*** org.apache.commons.io.FilenameUtils工具类笔记* author*/public class FilenameUtilsTest {public static…

python类继承返回值_python继承threading.Thread实现有返回值的子类实例

继承与threading.thread实现有返回值的子类mythread,废话不多说,大家直接看代码import threadingclass mythread(threading.thread):def __init__(self,func,args()):super(mythread,self).__init__()self.func funcself.args argsdef run(self):self.…

python继承super函数_Python中的super函数如何实现继承?

本篇文章给大家带来的内容是关于Python 中的super函数如何实现继承?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承。Py 3.x 中类的继承可以直接使用…

java逸出_Java并发编程 - 对象的共享

编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理。同步代码块和同步方法可以确保以原子的方式执行操作,同步还有另一个重要的方面:内存可见性。可见性为了确保多个线程之间对内存写入操作的可见性&…

mgr未同步 mysql_mysql8.0 搭建mgr踩坑记录

启动总是报错:2020-08-21T04:52:36.332502Z 10 [System] [MY-010597] [Repl] CHANGE MASTER TO FOR CHANNEL group_replication_applier executed. Previous state master_host, master_port 3306, master_log_file, master_log_pos 4, master_bind. New state mast…

java rpm包安装_rpm包安装java jar开机自启

1.下载jdk2.安装jdk;rpm -ivh jdk-8u201-linux-x64.rpm3.检查安装:java -version输出Java版本,则不用第4步和第5步4.配置jdk路径打开/etc/profile增加以下内容:export JAVA_HOME/usr/java/jdk1.8.0_201export JAVA_BIN/usr/java/j…

idea 保存设置 新建项目_配置、创建IntelliJ IDEA Spring MVC 项目

前言步骤,下载安装 IntelliJ IDEA及Tomcat 客户端、服务端下载安装,这些都配置完之后准备创建项目点击下一步修改完项目名称其他的名称也跟项目名称一样,我就改了保存位置其他都跟项目名称一样的名字,点击Finish后会下载本框架需要…

java+中的final关键字有哪些用法_Java中的Final关键字用法汇总及简单示例

可能使用到final的情况有3种:数据、方法和类。一、final数据对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法把它改为指向另一个对象。然而,对…

mr图像翻转的原因_MRI图像常见问题及对策

1MRI图像常见伪影及对策伪影是指MR图像中与实际解剖结构不相符的信号,可以表现为图像变形、重叠、缺失、模糊等。每一幅MRI图像都存在不同程度的伪影。MRI检查中伪影主要造成三个方面的问题:(1)使图像质量下降,甚至无法分析;(2)掩…

java icon动态变换,以编程方式自动更改ImageIcon [Java]

I am making a simple game right now. When a JButton is clicked, the ImageIcon of a JLabel is supposed to change. How can I accomplish this?解决方案Simple, just quickly run setIcon() on the JLabel via the action listener of the button.An example:if ("…

shell打开wifi命令_MacWiFi:一款管理Mac系统WIFI的命令行工具(包含交互式Shell)...

今天给大家介绍的是一款名叫mac-wifi的命令行工具,它可以管理macOS系统的无线网络,并且还提供了交互式Shell。mac-wifimac-wifi脚本可以查询或管理macOS平台上的WiFi配置以及网络环境信息,脚本代码在最小化的类中实现了针对macOS环境的设计逻…

java电脑类的接口_java 一个类实现两个接口的案例

直接用英文逗号分隔就可以了,比如:?12345678910111213141516171819inerface IHello {String sayHello(String name);}interface IHi {String sayHi(String name);}class ServiceImplimplements IHello, IHi {// 实现三个四个。。。n个接口都是使用逗号分…

单片机 架构 程序 经验总结_单片机学习心得体会_经验总结

单片机简介单片机主要由运算器、控制器和寄存器三大部分构成。其中,运算器由算术逻辑单元(ALU)、累加器、寄存器等构成,首先累加器和寄存器向ALU输入两个8位源数据,其次ALU完成源数据的逻辑运算,最后将运算结果存入寄存器中;控制器…

java按照io流向基类_Java IO详解

1 Java IO流的概念,分类1.1 Java IO流的概念java的IO是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。流的本质是数据传输&#xff0c…

go语言os.exit(1)_在Golang中各种永远阻塞的姿势

在Golang中各种永远阻塞的姿势Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。可以通过调用os.Exit或从main()函数的返回来以正常方式终止程序。而有时候我们需要的是使程序阻塞在这一行。使用sync.WaitGroup一直等待直到Wa…

基于java二手书论文_java毕业设计_springboot框架的二手书交易管理与实现

今天介绍一个java毕设题目, 题目内容为springboot框架的二手书交易管理与实现, 是一个采用b/s结构的javaweb项目, 采用java语言编写开发工具eclipse, 项目框架jspspringbootmybatis, 二手书交易管理与实现的信息存储于mysql中, 并基于mybatis进行了orm封装, 该二手书交易管理与…

vue 分享微信传参_vue实现微信分享链接添加动态参数的方法

微信分享时 分享链接携带参数可能不是固定的 需要在分享的前一刻才知道 这里就是动态设置分享链接的基本写法 代码不是那么详尽 但大致流程如下1.安装引用jssdknpm install --save weixin-js-sdkconst wxrequire(weixin-js-sdk)2.通过config接口注入配置信息const jsApiList […

linux挂载cifs磁盘_linux使用windows磁盘,挂载共享目录

实例说明:客户两台服务器,一台web服务器(linux)只有50G,课程资源太多太大导致磁盘不够用;客户的文档服务器(windows)磁盘很大超过1T,所以产生了,将web资源使用文档服务器磁盘的想法;windows文档服务器192.168.-.-用户名…

java怎么给list集合排序_java list集合排序按某一属性排序操作

我就废话不多说了,大家还是直接看代码吧~public List sortList(List list){Collections.sort(list, new Comparator(){Overridepublic int compare(FreightM o1, FreightM o2) {if(o1.getType()0){return -1;}else{return 1;}}});return list;}实现compareTo()方法&…

excel显著性检验_使用Excel2016比较两组数据显著性差异

软件信息:Excel for Mac版本:16.26(19060901)许可证:Office 365订阅步骤一:导入(输入)数据步骤二:为Excel添加分析工具的加载项插件,路径为:工具→Excel加载项→分析工具库步骤三:开…