人工智能大模型加速数据库存储模型发展 行列混合存储下的破局

news2024/11/25 4:56:39

在这里插入图片描述

数据存储模型

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程
  • toadb开源库

个人主页:我的主页
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

概述

在数据库的发展过程中,关系型数据库是一个里程碑式的阶段,现在关系型数据仍然占据着重要地位。
在关系型数据中,每张表都是一个关系,每行数据就是关系的一条记录,在存储时每行数据存储在连续的位置,行与行也是连续存放;
这样方便一次能拿到一整条记录。

处理业务类型

随着互联网的兴起,存储容量的提升和计算能力的飞越,我们的生活中不断增加了越来越多的被智能设备,产生了无尽的信息。
这样的信息规模已经超越了某一单体的能力限制,它们被不断分类,对于数据库处理模型,常常分为:

  • 在线事务处理模型(OLTP), 主要以事务一致性,关系型数据为主;
  • 在线分析处理模型(OLAP), 主要以分析统计为主,更多的是从大量数据中提取某几个维度的数据;

但是这样的划分,还远远不能满足信息爆炸带来的需求,它不是非黑即白的界线明晰的分类,还有大量同时存在OLTP和OLAP的特点的数据和业务,此时就需要一种混合性数据库存储模型。

数据存储模型原理

是什么

通过SQL插入的数据,在数据库中实际也是要存到磁盘上的,此时还要考虑我们写入的效率,读取的效率,如何产生的IO次数更少,那以什么格式组织这些数据,才能达到这样的目标呢?

我们使用的文件系统,都是以块为单位进行读写物理存储设备,常用的块大小有2k, 4k等;那么数据库为了提升性能,也选择以块为单位来组织数据,每次按块进行读写数据文件。
每个数据块内又分为:块头信息域,数据域的起始偏移,数据域,在数据域中按逻辑表的行进行连续存储。

当然行数据,又分为定长或变长两种不同的组织方式;定长,就是每种数据类型固定了长度,这样一行数据的长度也是确定的;变长类型,就是像字符,文本等长度是可变的,那么存储时需要记录长度。
它们最大的区别在于更新时,定长是可以直接覆盖更新的,而变长就需要追加更新。

为什么存储模型这么重要

因为我们的存储到数据库中的数据都是持久化到磁盘中,当我们查询时,再从磁盘中读出,
虽然我们数据库和操作系统层面都已经做了缓存,当数据量大时还是会产生大量的磁盘IO,而且数据库大多数情况下都是随机访问,缓存并不保证全部命中。

相较与内存速度来讲,磁盘速度是极底的,但是内存往往是有限的,所以存储模型至关重要,通过将随机写转换为顺序写,少的IO就可以精确找到数据,减少遍历,这些都可以做到减少IO次数,提升性能。

数据存储模型类型

NSM模型

故名思义,就是按行数据排列的数组形式, 数据的物理结构和他们的逻辑结构是一样的,也就是我们常说的行存储模型,这也是大多数关系型数据库采用的存储模型。

物理存储结构

磁盘是由一个一个数据块组成的,因此连续的数据也分在了连续的数据块。
每个数据块中又分块头信息,记录块中数据的起始偏移,每行数据分为 行的数据偏移item,从块头后面连续存储, 以及真正的行数据,它从块的末尾开始向头部方向连续存储,这是为了方便空闲空间的管理。

表数据与物理存储结构对应 如下图所示 :

物理存储结构

应用场景

  • 它的优势在于对关联数据的查询非常快,比如根据身份证号就可以一次读出姓名,住址等一系列信息。
    在此基础上对于复杂的嵌套join就非常有优势,因为它的各列数据都在一起。

不适合场景

  • 对于只查找部分列属性数据的业务,就会增加IO的成本,它需要全行数据的读出。对于按3NF设计,还是一张大宽表,都避免不了缓存效率的降低。

DSM模型

分解的存储模型,也就是将一行中的各字段存储到不同的数据单元中,当需要某列数据时,只从磁盘加载部分数据,如果需要整行数据,那就加载全量数据,然后进行行组装。

可以是每一列都分别存储,也可以根据业务需要不规则的划分,比如有三列经常会相时查询,那这三列可以一起存储,剩余的列分别存储。

物理存储结构

常见的格式有:

  • PAX
  • RCFile(record columnar file)
  • Apache ORC
  • Parquet (An Open Columnar Storage for Hadoop)

它们中更多偏向分析型列式存储,可以处理大量的时序,流式数据,也有一些偏向于行列的混合型,每种格式都有成熟的产品应用。

应用场景

它们的场景更多偏向分析型,如hdoop系列的,使用ORC, Parquet。

混合型数据存储模型

为了综合以上NSM和DSM各自的优势,互补长短,目前一些数据库已经采用了一些混合的存储模型。

常见混合模型实践

  • 数据冗余型

在存储数据时,干脆两种格式同时进行存储,一种按行进行存储,一种按列分别存储,这样避免了转换带的复杂度,用空间来换取性能;在优化引擎中可以选择更适合的路径;

  • 数据转换型

因为行存必须带来IO的放大,也以实际存储采用列式存储,在使用时进行组装成逻辑行数据;这种模型的难点在于,如何准确的找到逻辑行中的各字段,大多都采用PAX中提到的分组的方式。

难点

在大数据处理中,已经不局限于关系型数据,更多的是非关系型,如文本,json数据,如何将它们转换成列数据,可以快速查找,这将是混合型存储模型面临的一项挑战。

最近兴起的向量数据量,向量与大模型维度是对应的,底层数据库存储就需要将各类型数据进行分别存储。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

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

相关文章

【Linux】进程间通信之信号机制

文章目录 信号的概念信号的产生硬件产生(按键盘中的按键)软件产生kill函数kill命令abort函数raise函数 捕捉信号后的处理方式默认处理方式SIG_DFL忽略处理方式SIG_IGN自定义信号处理方式signal函数sigaciotn函数 信号的注册进程中的未决信号集&#xff0…

在python中通过调用dll来提高运行速度

1、前言 最近项目中需要录制键鼠命令,然后再通过注入的方式回放录制过程。一般来说,普通的一些点击命令完全可以通过python的一些包来完成键鼠模拟操作,比如通过pyautogui包。但是,鼠标移动过程中,如果采用频率很高的…

C++对象模型实验(clang虚函数表结构)

摘要:本科期间有对比过msvc,gcc,clang的内存布局,距今已经6-7年了,当时还是使用的c11。时间过得比较久了,这部分内容特别是内存对齐似乎C17发生了一些变化,因此再实践下C类模型。本文描述了C不同…

DuckDB Executor:物理计划构建Pipeline并执行(PipelineExecutor)

2023-03-20 duckdb-Push-Based Execution Model 如下SQL的物理计划执行 select 100(select 3), id from user where id (select id from score where id 1) Pipeline与MetaPipeline Pipeline是一串Op. MetaPipeline是pipeline组成的树 Executor构建MetaPipeline MetaPip…

【汇编语言】关于“段”的总结

文章目录 各种段三种段具体案例截图数据段、栈段、代码段同时使用不同段地址数据段、栈段、代码段同时使用一个段地址![在这里插入图片描述](https://img-blog.csdnimg.cn/45c299950ad949e3a90b7ed012b3a9ee.png) 各种段 1、基础 物理地址 段地址 x 16 偏移地址 2、做法 编…

Redis——主从复制+集群搭建(非哨兵)

主从复制 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower); 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave…

CentOS6.8图形界面安装Oracle11.2.0.1.0

Oracle11下载地址 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 一、环境 CentOS release 6.8 (Final),测试环境:内存2G,硬盘20G,SWAP空间4G Oracle版本:Release 11.2.0.1.0 安装包:V175…

【C++奇遇记】构造函数 | 初始化列表

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…

LeetCode:Hot100python版本之回溯

回溯算法其实是纯暴力搜索。for循环嵌套是写不出的 组合:没有顺序 排列:有顺序 回溯法可以抽象为树形结构。只有在回溯算法中递归才会有返回值。 46. 全排列 78. 子集 17. 电话号码的字母组合 39. 组合总和 22. 括号生成 79. 单词搜索 ​​​​​​13…

剪枝基础与实战(3): 模型剪枝和稀疏化训练流程

Model Pruning 相关论文:Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017) 考虑一个问题,深度学习模型里面的卷积层出来之后的特征有非常多,这里面会不会存在一些没有价值的特征及其相关的连接?又如何去判断一个特征及其连接是否有价值? …

Android学习之路(7) Frament

Fragment 表示应用界面中可重复使用的一部分。fragment 定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。fragment 不能独立存在。它们必须由 activity 或其他 fragment 托管。fragment 的视图层次结构会成为宿主的视图层次结构的…

2023国赛数学建模C题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

【Keil软件 ST-Link下载问题】:提示ST-Link需要升级,但是升级之后会报错:Upgrade Error, Please try again.

项目场景: 报错: 平常一直使用J-link,一直没有问题,今天使用了一下ST-Link发现了问题,下载不进去。 并且提示我需要升级ST-Link,我按照规定的升级,但是依然报错。 下面是我的心路历程&#xff…

JDK中的Timer总结

目录 一、背景介绍二、思路&方案三、过程1.Timer关键类图2.Timer的基本用法3.结合面向对象的角度进行分析总结 四、总结五、升华 一、背景介绍 最近业务中使用了jdk中的Timer,通过对Timer源码的研究,结合对面向对象的认识,对Timer进行针…

简单认识Docker数据管理

文章目录 为何需要docker数据管理数据管理类型 一、数据卷二、数据卷容器三、容器互联 为何需要docker数据管理 因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在…

合宙Air724UG LuatOS-Air LVGL API--运行

硬件准备 可以使用 724A13 开发板 ST7735S 屏幕 或者 iCool 开发板 软件准备 底层固件 底层固件需要支持 LVGL,通常选用的固件是 LuatOS-Air_VXXXX_RDA8910_BT_FLOAT.pac。 当然,您也可以通过 更新说明 选择支持 LVGL 的其他底层版本。 脚本 首先需要…

垂类模型大有前景,但AGI却给自己“挖了个坑”

巨量模型是个“坑”,但垂直模型不是。 数科星球原创 作者丨苑晶 编辑丨大兔 2023年4月,GPT-5的相关消息引起了一阵轰动。彼时,人们对巨量大模型既有期待、也有恐惧。更有甚者,认为人类历史或许将因此而画上终止符。 但很快&#…

Java并发编程之线程池详解

目录 🐳今日良言:不悲伤 不彷徨 有风听风 有雨看雨 🐇一、简介 🐇二、相关代码 🐼1.线程池代码 🐼2.自定义实现线程池 🐇三、ThreadPoolExecutor类 🐳今日良言:不悲伤 不彷徨 有风听风 有…

基于 BEM 规范实现简单的全局 scss

该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>&#xff0c;且包含 typescript 的基础用法 前言 BEM 是 css 常用的命名规范BEM &#xff1a;block(块)、 element(元素)、 modify(修饰符)以 namespace-block__element、namespace-block---modify 格式…

【es6】中的Generator

Generator 一、Generator 是什么&#xff1f;1.1 与普通函数写法不一样&#xff0c;有两个不同 二、Generator 使用2.1 书写方法 三、yield语句3.1 yield和return3.2 注意事项3.3 yield*语句3.4 yield*应用 四、next方法4.1参数 总结 一、Generator 是什么&#xff1f; Genera…