《深入浅出存储引擎》不同数据库背后的数据存储方案

在大数据和AI时代,数据库成为各类应用不可或缺的重要组成部分。而数据库中的数据依赖存储引擎进行管理,包括数据的存储、查询、更新和删除等。因此,在设计系统时,选择正确的数据库存储引擎方案变得尤为重要。这篇文章将以关系型、NoSQL和NewSQL数据库,以及OLTP、OLAP和HTAP处理方式为切入点,深入探讨不同类型的数据库背后的存储引擎方案选型取舍。

  • 作者:文小飞

01 关系型数据库&NoSQL数据库&NewSQL数据库

下图展示了关系型数据库、NoSQL数据库、NewSQL数据库的发展过程。

图片

 

1. 关系型数据库

关系型数据库也称为SQL数据库,最早的数据库发展可以追溯至1970年IBM研发的第一个SQL数据库System R,这也是最早的SQL数据库,再后来1980~1990年这段时间涌现出来了一些SQL数据库产品,例如Oracle、DB2、SQL Server、PostgreSQL、MySQL等。

到2000年左右,关系型数据库越来越丰富,出现了很多迄今一直在发挥重要的组件,例如MySQL、Oracle等。

SQL数据库按照以“行”为单位的二维表格存储数据,这种方式最符合现实世界中的实体,同时通过事务的支持为数据的一致性提供了非常强的保证。因此SQL数据库主要适合的场景是读多写少的场景。

关系型数据库中为了适配不同的应用场景,通常会将存储引擎设计为插件式的接口。然而主流的存储引擎,仍然是读多写少的特点。以MySQL为例,InnoDB存储引擎被广泛运用,它通过B+树来存储索引和数据。B+树这种数据结构,由于其独特的特性使得查询的性能非常高。

B+树存储引擎适用于需要高效的数据查找、范围查询和顺序访问的场景。它在关系型数据库中被广泛应用,如MySQL的InnoDB存储引擎和Oracle的B+树索引。然而,B+树存储引擎对于频繁的数据插入和删除操作可能会有一定的开销,因为这会触发节点的分裂和合并操作。

2. NoSQL数据库

在面对海量数据存储、高并发访问的场景下,关系型数据库的扩展性和性能会受到限制。随着互联网的飞速发展,到2000年左右,存储海量数据、高并发处理读写的需求变得非常明显。这对SQL数据库提出了巨大挑战。为了解决这个问题,出现了支持数据可扩展性、最终一致性的NoSQL数据库。因此,NoSQL数据库可以看作是基于SQL数据库的缺陷而诞生的一种新产品。

NoSQL组件普遍选择牺牲复杂SQL的支持及ACID事务功能,以换取弹性扩展能力和更高的读写性能。这类系统主要存储半结构化或非结构化数据。根据存储的数据种类,NoSQL数据库主要分为基于文档存储的文档数据库(Document-based Database)、基于键-值存储的键值数据库(Key-Value Database)、图数据库(Graph-based Database)、时序数据库(Time Series Datebase)、宽列式存储(Wide Column-based Store)以及多模数据库(Multi-Model Database)。

不同类型的NoSQL数据库特性如下图所示。

图片

 

NoSQL数据库典型的特点是具备很高的读写性能,但数据一致性保证较弱。绝大多数的NoSQL数据库适合写多读少、写多读多的场景。以列式数据库、时序数据库而言,它们通过LSM的思想,提供了非常高的写入性能。这类系统的存储引擎广泛意义上也称为LSM Tree存储引擎,这些系统单机的存储引擎有RocksDB、LevelDB等。此外再以键值数据库为例,它们绝大部分通过利用哈希表这种数据结构,外加内存介质存储数据。实现非常高的读写性能。Redis就是这类系统的典型代表。

3. NewSQL数据库

虽然NoSQL数据库解决了关系型数据库存储的缺陷,但它也没法完全替代掉关系型数据库。在NoSQL数据库出现后的一段时间内,互联网软件的构建基本上都是结合二者来提供服务。在不同的场景下选择不同的数据库进行存储数据。虽然这样的合作方式很好,但是在这样的模式下,一个用户可能会因为场景的不同而存储多份相同的数据到不同的数据库中,当用户量级和存储数据量很小的情况下没什么问题。一旦量级发生变化就会引发出新的问题。

随着存储数据量的不断增加,造成资源的浪费和成本的上升不容忽略。于是工业界和学术界都在寻找更好的解决方案,直到2010年左右,诞生了NewSQL数据库(也称为分布式数据库)。它的出发点是结合关系型数据库事务一致性,又具备NoSQL数据库的扩展性及访问性能。这无疑给系统的设计及实现带来了更大的挑战,NewSQL数据库不仅要考虑单机环境下高效存储的问题,还需要考虑多机情况下数据复制、一致性、容灾、分布式事务等问题。目前NewSQL数据库典型的代表作有TiDB、OceanBase、CockroachDB等。NewSQL数据库中绝大部分的系统还是采用LSM 树存储引擎,来实现系统高性能的写入。

02 OLTP&OLAP&HTAP对比

在现代数据管理领域,OLTP、OLAP和HTAP是常见的数据库类型,它们各自针对不同的数据处理场景和需求。本文将对这三种数据库进行对比,以帮助读者更好地理解它们的特点和适用性。

1. OLTP数据库

OLTP数据库(联机事务处理)是专门设计用于处理事务性工作负载的数据库系统。它们被广泛应用于业务应用程序,如在线购物、银行交易和订单处理等。OLTP数据库的主要特点是高并发、低延迟和高事务吞吐量。它们通过支持ACID(原子性、一致性、隔离性和持久性)特性来确保数据的一致性和可靠性。OLTP数据库通常采用规范化的数据模型,以支持高效的事务处理和即时的数据更新。

OLTP数据库主要的功能是处理用户在线实时的请求,直接为用户提供服务,因此这类数据库通常对处理请求的时延要求比较高,绝大部分的请求正常情况下会在毫秒级完成。OLTP数据库很多,除了大家最熟悉的关系型数据库(如MySQL、Oracle)外,还有Redis、MongoDB等这些非关系型数据库。绝大部分的OLTP数据库则是采用B树、B+树甚至哈希表来构建存储引擎。

2. OLAP数据库

OLAP数据库(联机分析处理),它们专注于支持决策支持和分析工作负载。OLAP数据库用于处理大量数据的复杂分析查询和报表生成。OLAP系统的关键特点是高度可扩展、支持复杂的分析操作和提供灵活的数据聚合能力。为了实现这些特性,OLAP数据库通常采用了针对分析查询优化的特殊数据结构,如多维数据模型(如星型或雪花模型)和列存储技术。此外,OLAP数据库还提供了灵活的查询语言和数据切片、切块、钻取等功能,以支持交互式的数据分析和探索。

OLAP数据库在功能上侧重于对数据或者任务进行离线处理,它不直接对用户提供服务。OLAP系统对请求的处理通常比OLTP慢得多,一般在秒级、分钟级甚至小时级,通常在数据统计、报表分析、推荐系统数据聚合分析等场景用的比较多。这一类数据库典型的代表有HBase、Teradata、Hive、Presto、Druid、ClickHouse等。互联网企业往往都需要使用OLTP和OLAP。因此为了满足这两类需求,通常需要结合多个系统一起开发使用。这样的做法当然是可行的,而且基本也是采用这种方式进行实现。绝大部分的OLAP数据库是采用LSM树构建存储引擎。

3. HTAP数据库

随着数据处理需求的不断演变,需要存储的数据量爆炸式增长,在这种模式下直接带来的存储成本问题成为新的矛盾点,人们开始探索是否能诞生一种数据库将OLTP和OLAP这两类应用合二为一呢?于是,HTAP(混合事务/分析处理)数据库应运而生。HTAP数据库旨在将OLTP和OLAP的功能集成到同一个数据库系统中,以满足实时分析和事务处理的需求。HTAP数据库通过在同一数据库上同时支持事务处理和分析查询,消除了数据复制和数据移动的需求,提供了更高的数据一致性和实时性。HTAP数据库通常采用了内存计算、分布式架构和智能查询优化等技术,以保证高性能和灵活性。这类数据库既可以处理在线事务处理,又可以处理在线分析处理。可以认为HTAP=OLTP+OLAP。HTAP的主要代表有TiDB、OceanBase、CockroachDB等。

在选择数据库时,需要考虑具体的业务需求和性能要求。如果您需要处理大量的事务性工作负载,如在线交易,那么OLTP数据库是一个理想的选择。如果您的需求是进行复杂的数据分析和报表生成,那么OLAP数据库可能更适合。而如果您需要同时满足实时分析和事务处理的需求,那么HTAP数据库是一个值得考虑的选项。

总而言之,OLTP、OLAP和HTAP数据库各自针对不同的数据处理场景和需求。了解它们的特点和适用性,可以帮助您在选择数据库时做出明智的决策,并确保满足业务的需求和性能要求。

03 总结

如果以组件的类型是关系型数据库还是非关系型数据库,并结合服务的场景是OLTP还是OLAP来对业界各种存储组件进行划分的话,可以得到如下图所示的结果。关系型数据库中既有为OLTP设计的,也有为OLAP设计的,同时还有新兴发展起来兼容二者的HTAP数据库。这些系统都有各自适用的业务场景,它们在存储引擎选型时,往往会根据适用场景来决定。如果是读多写少的场景,通常会选择B+树、哈希表来构建存储引擎。而如果是写多读少的场景,往往会选择LSM树来构建存储引擎。

图片

 

关于作者:文小飞 (网名:jaydenwen/jaydenwen123),大厂资深研发工程师、公司级讲师。曾就职于腾讯等互联网公司,从事基础架构、后端开发、推荐系统架构等工作,具有丰富的基础架构经验。对技术充满热情,尤其对存储引擎、分布式共识算法等技术有较为深入的理解,曾编写开源书籍“自底向上分析 BoltDB 源码”,并发布“数据存储与检索”等网络课程。业余时间喜欢阅读开源项目源码,学习新技术。

- END -

本文摘编自《深入浅出存储引擎》,经出版方授权发布。

图片

延伸阅读《深入浅出存储引擎》

推荐语:带你吃透存储引擎底层原理与实践技巧,攻克业务难题。通过阅读本书,读者不仅能对存储引擎,尤其是单机的存储引擎有一个整体的框架,而且能对两类存储引擎的实现思路及背后原理有个深刻的掌握,只有深刻理解了存储引擎的背后实现原理,读者不仅可以自己动手开发自己的存储引擎,更可以很快掌握关系型数据库或者NoSql这类组件的核心原理,对未来实际应用与开发提供参考。

购买链接:

https://mp.weixin.qq.com/s/VyGBUZSvr1ZcRw4s4imurw

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

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

相关文章

会计电子档案系统方案

会计电子档案系统方案是指建立一个以电子方式存储和管理会计档案的系统。该方案具体包括以下几个方面: 1. 系统架构设计:确定系统的组成以及各个组件之间的关联和交互方式。包括数据库设计、系统服务器和客户端的部署等。 2. 电子档案管理:建…

一切模型皆可联邦化:高斯朴素贝叶斯代码示例

联邦学习是一种分布式的机器学习方法,其中多个客户端在一个中央服务器的协调下合作训练模型,但不共享他们的本地数据。一般情况下我们对联邦学习的理解都是大模型和深度学习模型才可以进行联邦学习,其实基本上只要包含参数的机器学习方法都可…

C# 实时声音频率图绘制

C# 实时声音频率图绘制 采集PCM音频数据 音频原来自麦克风 音频源来自录音文件 处理PCM音频数据 使用 FftSharp.FFT 将PCM数据进行傅里叶变换 安装FftSharp框架 在Nuget包管理器中搜索FftSharp并安装 傅里叶变换 将采集到的PCM数据进行傅里叶变换 // 傅里叶变换System.…

新手如何正确使用代理IP,一篇文章学会,包含实战案例

前言 一、代理IP1.1 什么是代理IP?1.2 代理ip分类1.3 代理IP的作用和优势 二、更换代理IP的方法2.1 重启路由器或光猫2.2 用拨号 vps 重拨更换动态IP代理。2.3 使用浏览器更换IP 三、IPIDEA代理的优势四、提取代理IP4.1 提取步骤4.2 浏览器使用代理IP 五、使用代理I…

CSS(盒子模型,定位,浮动,扩展)

CSS 盒子模型:外边距:内边距:水平居中: 定位:相对定位:绝对定位:固定定位: 浮动:扩展: 盒子模型: 盒子模型(Box Model) 规定了元素框处理元素内容…

Java核心: 使用instrumentation

在上一篇Java核心: 注解处理器我们提到,通过实现AbstractProcessor,并调用javac -processor能够生成代码来实现特殊逻辑。不过它存在两个明显的问题: 只能新增源文件来扩展逻辑,无法修改现有的类或方法必须有一个单独的编译过程,…

3毛钱的QC协议芯片TYPE-C USB快充接口物理层IC

前言: 现在基本使TYPE-C打天下了。很多产品和TYPEC息息相关,如笔记本的电源接口,手机更不用说了,甚至电烙铁也使TYPE-C接口的了,很多涉及采用TYPE-C接口的快充接口,简单的可以用电阻欺骗快充头&#xff0c…

什么是it运维工单系统?有哪些应用价值?

it运维工单系统是一个智能化的it运维服务管理系统,可以为企业和服务提供商提供高效的it运维服务管理,它可以自动分配任务、优化工作流程并跟踪工作进展,从而大大提高it运维工作效率和客户满意度。 一、it运维工单系统是什么? it…

100000开发的系统,执意重构钱多执念?

收到一位客户询盘,要重做自己的系统,原因:嫌弃基于PHP做的系统服务器消耗大。咨询了好几拨人,觉得外包公司贵,个人程序员又不靠谱,总之一门心思要重构。 现状: 1、系统研发耗费100000。 2、目…

Java编程常见问题汇总五

系列文章目录 文章目录 系列文章目录前言一、捕获不可能出现的异常二、transient的误用三、不必要的初始化四、最好用静态final定义Log变量五、选择错误的类加载器 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

docker create rm export exec命令详解

容器生命周期管理命令教程-3 1. 创建容器 docker create:创建一个新的容器但不启动它。 docker create -it --name mycontainer ubuntu bash通常使用 docker run(详细可看上一篇关于run命令的详细介绍) 2. 删除容器 docker rm:删除一个或多个容器。 d…

【python】 ModuleNotFoundError: No module named datasets

成功解决“ModuleNotFoundError: No module named datasets”错误的全面指南 在Python编程中,遇到ModuleNotFoundError: No module named datasets这样的错误通常意味着Python解释器无法找到名为datasets的模块。datasets是一个流行的Python库,常用于加载…

[leetcode hot 150]第一百三十六题,只出现一次的数字

题目: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 根据题目关于空间、…

心链9----组队功能开发以及请求参数包装类和包装类实现

心链 — 伙伴匹配系统 组队功能开发 需求分析 理想的应用场景 我要跟别人一起参加竞赛或者做项目,可以发起队伍或者加入别人的队伍 用户可以 创建 一个队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0 队长、剩余的人数…

【WEB系列】过滤器Filter

Filter,过滤器,属于Servlet规范,并不是Spring独有的。其作用从命名上也可以看出一二,拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servl…

海报在线制作系统

文章转载自:FastAdmin海报在线制作系统 - 源码1688 应用介绍 介绍 新机构海报是一款基于FastAdminThinkPHP开发的一款新机构海报。 采用JavaScript vue canvas技术,实现在线一键制作海报,生成海报。 功能特性 1、自由创作 2、一键制作…

Django使用正则表达式

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等,可以从前言给出的下载信息下载,大家可以评估一下。 在Django框架的新版本(v2.0 )中,URLc…

ECharts 图形化看板 模板(简单实用)

目录 一、官网 二、模板 ①定义请求​编辑 ② 将请求统一管理,别的页面引用多个请求时更便于导入。​编辑 ③最终模板 三、执行效果 四、后端代码 4.1 controller 4.2 xml 4.3 测试接口 一、官网 获取 ECharts - 入门篇 - 使用手册 - Apache ECharts 二、…

ARM32开发——串口库封装(初级)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 开发流程分组创建 接口定义完整代码 开发流程 在文件系统中,创建库目录Library在keil工程中,创建分组管理…

Vue3-组件通信详解

文章目录 组件通信的含义Vue3组件通信和Vue2的区别组件通信的具体实现props(父子组件通信)自定义事件(子传父)mitt(任意组件间通信)v-model$attrs (非props的父子组件通信) r e f s …