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 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…

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

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

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

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

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()方法&…

java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

[Java教程]Java字节流与字符流的区别0 2017-05-22 12:00:42字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的&#xff0c…

php获取html中文本框内容_小猿圈Python入门之批量获取html内body内容的方法

对于人工智能你了解有多少?你知道Python的使用吗?这个对于大部分初学者来说都是很难的,小猿圈Python讲师会每天为大家选择分享一个知识点,希望对你学习Python有所帮助,今天分享的就是批量获取html内body内容的方法。现…

php改名下载,PHP如何给上传的文件改名

PHP如何给上传的文件改名发布时间:2020-08-03 16:07:39来源:亿速云阅读:72作者:LeahPHP如何给上传的文件改名?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这…

python 循环 覆盖之前print内容_Python爬虫第二战---爬取500px图片

前言:如今的高速网络极大促进了信息的展示方式,高清图片,视频等成就了我们的视听盛宴。但是,我们获取到的图片或者视频可能是被压缩过的,所以总体上还是有点小瑕疵,今天呢,我给大家带来一篇使用…

php字符串分割tp模板,ThinkPHP 模板substr的截取字符串函数详解

ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码/**** 截取中文字符串**/function msubstr($str, $start0, $length, $charset"utf-8", $suffixtrue){if(function_exists("mb_substr")){$slice mb_substr($str, $start, $length, $…

vscode中如何创新建php文件,vscode如何创建代码模板

选择菜单里的 文件 > 首选项 > 用户代码片段选择你需要自定义模板的文件,以vue为例配置对应文件json把代码片段写在json里。每个代码段都是在一个代码片段名称下定义的,并且有prefix、body和description。prefix是用来触发代码片段的。使用 $1&…

php 利用个人邮箱,利用 Composer 完善自己的 PHP 框架(二)——发送邮件

利用 Composer 完善自己的 PHP 框架(二)——发送邮件2014-10-18 / 阅读数:23506 / 分类: PHP回顾上一篇文章中,我们手工建造了一个简易的视图加载器,顺便引入了错误处理包,让我们的 MFFC 框架在 M、V、C 三个方面都达到…

启动马达接线实物图_东元伺服驱动马达

东元伺服驱动马达,我公司主营德国SEW,德国法勒VAHLE, 德国UNING,德国同驰Tschan,意大利威卡WESTCAR,德国久茂JUMO,瑞士ABB等几大世界品牌产品。东元伺服驱动马达, 工业机器人电动伺服系统的一般…

三维数据平滑处理_黑白象片的密度信息 卫星数据处理 遥感制图 三维建模 善图科技...

黑白象片的密度信息象片上的黑白变化,可划分为若干等级,此等级称之为灰阶。象片上的灰阶数受洗印技术及目视分辨能力的限制,一般不超过10个灰阶。灰阶较多时,象片上层次分明易于分辨一些细节。但灰阶的增多必导至对比度相对下降&a…

oracle左连接数据会对不上吗,一周工作总结–左连接造成的一些问题-Oracle

一周工作总结–左连接造成的一些问题今天有同事告诉我,有个SQL执行了好久好久执行不出来,我说好就是多久?她说一天左右了。真是令人咋舌的SQL。于是我要来了SQL看了看执行计划,确实让人咋舌。下图中就是执行计划的截图&#xff1a…

网页设计上机考试原题_全国计算机三级信息安全考试 经验分享

为什么选择信息安全?误打误撞报的名,正好又听说是三级里面最好过的。1)时间:九月份的考试,大概六月份报名。我在9月2日开学后,才开始准备的,也就二十几天的时间,而且我白天课不少&am…

newifi mini固件_如何在vmware虚拟机中安装OpenWrt系统,含x86固件编译教程

"OpenWrt项目是针对嵌入式设备的Linux操作系统", 这是官方给出的定义。OpenWrt确实是一个非常好的嵌入式学习系统,目前市面上上千款设备支持运行OpenWrt,如小米路由、newifi、netgear路由、360路由等。各大wifi芯片厂商sdk开始采用…

宝塔linux忘记密码,宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办

因为性能和安全性上的突出优势,现在用宝塔LINUX面板配置网站环境的站长越来越多,但一些粗心大意的站长经常会遇到这个问题,密码想不起来了,入口链接忘记了,宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办呢&…

minitab怎么算西格玛水平_六西格玛黑带培训工具因子分析的使用

六西格玛黑带培训工具因子分析的使用-张驰咨询一、该命令用于将数据结构简化为较少的量,因子分析的重点是确定能够解释数据变异大的因子数量。二、对话框内容。1、variables:输入需包含在分析中的变量栏。2、Numberoffactorstoextract:输入需…

linux curl 编译命令,linux 编译 curl 出错

编译curl make 死活不通过,唉执行参数如下,谢谢各位帮忙看看这一步一切正常rootdebian:~/curl-7.45.0# ./configure --with-sslmake一顿编译之后 ...... 然后出错了../lib/.libs/libcurl.so: undefined reference to SSLv2_client_method../lib/.libs/li…

linux 禁用smb服务,Samba 4.11 发布,更好的可扩展性与默认禁用SMB1

Samba 4.11是这个SMB/CIFS/AD实现的最新大功能更新,用于提供与Linux和其他平台更好的Windows互操作性。 Samba 4.11的变化非常多,我们有点惊讶它没有被称为Samba 5.0。也许最令人兴奋的是Samba 4.11具有很大的可扩展性改进,它应该能够扩展到1…