历史遗留问题1-Oracle Mysql如何存储数据、索引

在学习到Oracle redo和undo时,涉及到很多存储结构的知识,但是网上的教程都不是很详细,就去复习了一下mysql,感觉是不是开源的问题,Mysql的社区和知识沉淀远高于Oracle, 对于初学者很友好,我想请问深入学习这些知识学要怎么去了解,不会和win一样要打入内部吧!!!(本篇文章都是主观理解,作者自己知识的梳理,错误可能有点多)

数据库数据存储是一种逻辑结构,就像链表、树、堆一样,链表使用数组开辟一块内存放指向下一个数组的指针,堆是一种完全二叉树在底层其实维护的是一个数组,数据库索引的B-树、B+树,是一种多路平衡树,降低树的高度减少OS的IO操作,加入平衡算法防止线性化,3-4的高度就能满足大部分场景。其实学的数据结构数组、链表、堆、树、图都是逻辑上的,包括做开发用到的数据结构,做一些格式处理、格式转换,现在越来越方便,除了刷算法需要自己处理,平常都是用hutool等工具包,掉包,Python更甚,没有了解过底层是怎么存放的。Linux系统万物皆文件,在文件和文件管理这方面,是如何从内存写到寄存器、磁盘上的,存储格式是怎样的,一点都不懂。todo

为什么OS块4K、Oracle块8K、Mysql页16K,兼容有什么问题吗?

OS多开辟两个内存块存呗?

这种逻辑存储结构是如何存储到操作系统的?

我们看Mysql的

Mysql存储到操作系统上面,不同的引擎略有些差异,常用的InnoDB会有三个文件存放到操作系统,分别是.frm文件、.ibd文件、ibdata 文件

.frm文件存储表的定义,即表结构,包含表名、列定义、索引定义等元数据,每个InnoDB表都有一个对应的.frm文件

.ibd文件存储表的数据和索引(如果启用了innodb_file_per_table配置选项)包括表的数据行、主键索引、辅助索引以及MVCC(多版本并发控制)数据等

ibdata 文件存储InnoDB的系统表空间数据,包括数据字典、更改缓冲、撤销日志、锁信息等是一个共享的系统表空间文件,可能包含多个InnoDB表的数据(如果innodb_file_per_table未启用),以及其他InnoDB内部使用的信息。通常至少有一个ibdata文件(ibdata1),但可以通过配置增加更多的ibdata文件,并设置它们的自动扩展属性。

.ibd 文件的其他辅助文件: 除了 .ibd 文件本身外,InnoDB 存储引擎还会生成一些其他辅助文件,用于支持事务、恢复和性能优化等功能。这些辅助文件包括重做日志文件(redo log)、undo 日志文件、共享表空间文件等。这些文件通常不是直接用户可见的,而是由 MySQL 引擎管理的。

参考:Chat GPT:当使用 InnoDB 存储引擎存储数据时,每个表会对应一个 .frm 文件和一个 .ibd 文件(如果启用了单独表空间模式)。除此之外,InnoDB 还会生成一些其他辅助文件,用于支持数据库的事务和恢复功能。

MySql数据在磁盘上到底是怎么存储的?被存储的数据怎么查找? - 知乎 (zhihu.com)

MySQL数据文件介绍及存放位置 - jianhong - 博客园 (cnblogs.com)

B树这种逻辑结构存储到OS上是怎么存放的?

了解一下Mysql数据页的格式从 MySQL 数据页的角度看 B+ 树_b+数 调取某页数据到内存中,是什么形式-CSDN博客,大概有7个部分:

img

Mysql数据行格式

img

Oracle的数据行格式,在往底层了解一下就找不到资料了

img

MySQL创建的表查看表结构信息中,有一栏 columns,在其中我们会看到处理我们建表时指定的字段以外,还有额外的三个字段 分别是:DB_TRX_ID 、 DB_ROLL_PTR 、DB_ROW_ID

DB_ROW_ID: 隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

DB_TRX_ID :最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。

DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。’

有了这些知识再去学Mysql的备份恢复就会清晰很多,而且Mysql在做数据迁移时关注SQLthread两个IOthread线程和binlog日志就行,Mysql的存储结构和InnoDB结构很好理解,七个日志不需要全部了解。在学备份恢复就很简单,但是Oracle就学不明白他的某些方面的原理,学习曲线上比mysql高太多了。

其实怎么把数据存储到操作系统上,目前阶段还不需要太关心,可以把这个任务放到后面甚至时几年之后,但是今天在学习Oracle redo undo原理时,涉及到了存储结构,主要表达还是mysql和Oracle学习同样的内容,Oracle学习曲线上比mysql高太多了。排除Oracle和Mysql两者的复杂程度,客观上来讲Oracle对国内的学习支者持不是很友好,包括学习资料、知识沉淀、社区等,比如想搞懂一下页分裂、页合并阈值参数、数据行的存储格式、redo、undo的底层原理等,Oracle学起来都难太多了

索引相关

后面我又想到索引,主要是增加查询效率吗,对于OLTP系统来说是必要的,Oracle、MySQL都是在页目录里存放了索引信息,接着疑惑又来了,int自增主键的索引还比较好理解,那如果是非int型,我的理解是索引标识其实是一种类似二分查找的算法,需要自增,

如果不是自增的,会有什么影响?

首先我们知道,两者在建表时都会建立该系统默认的索引(B-树、B+树),默认是主键,没有主键会有一个隐藏字段Row_id,当作索引,这样一个B树的逻辑结构就有了,主键字段是数字类型 自增的,这里涉及到了主键优化的问题,如果主键不是自增的比如分布式系统中生成的UUID,64位的雪花算法虽然保证了大数据下的唯一性,但是在插入过程中或产生空间碎片,数据分布不均匀。主要是因为在看出过程中数据页会产生大量的页合并和页分裂。

为什么不用字符类型char、varchar、string当作索引?有没有一种算法是字符串生成自增唯一,那用什么算法实现呢?hash生成唯一标识符+时间戳?todo参考文献

还有就是在Mysql索引是由页目录维护的,页目录就是由多个槽组成的,槽相当于分组记录的索引。然后,因为记录是按照「主键值」从小到大排序的,所以通过槽查找记录时,可以使用二分法快速定位要查询的记录在哪个槽(哪个记录分组),定位到槽后,再遍历槽内的所有记录,找到对应的记录

如果我们增加一个索引,这个过程是什么样的?

主观猜想:首先把该字段通过算法(hash)生成一组多少位的二进制转成十进制进行排序,逻辑上建立B树,存储上在操作系统里告诉页目录,该索引字段的子节点内存地址只是多少,由页目录维护起来。那如果是联合索引呢?把三个字段放进算法(hash)生生唯一标识?为什么where后面不规范会造成索引失效?

太多问题了,午休时间到了,作为历史遗留问题,虽然可能工作中用不到这些,但是有精力和资料的话,还是学通透一些,可能在后面1年?3年?10年?搞明白了,去开国产发数据库😎

参考:

ChatGPT

在 Linux 操作系统上,当进行数据库数据的增删改查操作时,具体的数据存储方式取决于所使用的数据库管理系统(DBMS)和存储引擎。以下是常见的数据库系统在 Linux 上的数据存储方式:

  1. MySQL/Oracle 数据库

    • MySQL 和 Oracle 数据库通常使用类似的数据存储方式。数据存储在数据库文件中,这些文件通常以特定的扩展名(例如 .ibd 或 .dbf)存储在操作系统的文件系统中。

    • 对于 InnoDB 存储引擎,数据和索引分别存储在 .ibd 文件中。当执行增删改查操作时,数据会被写入到对应的数据文件中,然后由数据库引擎负责管理和维护。

    • 对于 Oracle 数据库,数据存储在表空间中的数据文件(.dbf 文件)中,而表空间由数据文件组成。当执行增删改查操作时,数据会被写入到对应的数据文件中,然后由 Oracle 数据库引擎管理。

  2. PostgreSQL 数据库

    • PostgreSQL 数据库使用 WAL(Write-Ahead Logging)机制,将数据和日志分开存储。数据存储在表空间中的数据文件中,而 WAL 日志存储在专门的日志文件中。

    • 当执行增删改查操作时,数据会被写入到对应的数据文件中,同时相应的 WAL 日志也会被写入到日志文件中,以确保数据的一致性和持久性。

  3. MongoDB 数据库

    • MongoDB 数据库使用 BSON(Binary JSON)格式存储数据。数据存储在数据文件中,每个数据文件包含了一个或多个数据集(Collection)的数据。

    • 当执行增删改查操作时,数据会被写入到对应的数据文件中,然后由 MongoDB 数据库引擎管理和维护。

总的来说,无论使用哪种数据库管理系统,数据存储在操作系统的文件系统中,具体的存储方式和文件结构取决于数据库管理系统和存储引擎的设计和实现。在执行增删改查操作时,数据会被写入到对应的数据文件中,并由数据库引擎负责管理和维护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(5)——可控评估端到端评估

最后完结篇,文末有测试中发现的有趣现象,并附上了相关资料链接~ 5.可控评估 分两个阶段评估生成代理。我们从一个更加严格控制的评估开始,单独评估代理的响应,以了解它们是否在狭义上定义的上下文中产生可信的行为。然后,在我们对代理社区进行为期两天的端到端分析中,我…

初始C++

1. C关键字(C98) C总计63个关键字, C语言32个关键字 ps:下面我们只是看一下C有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再 细讲。 2. 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,…

llama-factory SFT系列教程 (三),chatglm3-6B 大模型命名实体识别实战

文章列表: llama-factory SFT系列教程 (一),大模型 API 部署与使用llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署 llama-factory SFT系列教程 (三),chatglm3-6B 命名实体识别实战 简介 利用 llama-fa…

opencv | 编译缺失ippicv相关文件解决方案

1.执行cmake后,查看控制台输出信息 ~/VM_data/opencv-4.9.0$ cd buile_temp ~/VM_data/opencv-4.9.0/buile_temp$ cmake ..2.去浏览器打开链接,下载对应的压缩包,解压到 路径:/3rdparty/ippicv/

Ubuntu 安装 wine

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你使用 Ubuntu 系统,而有些软件只在 Windows 上运行,例如:PotPlayer,那么该如何在 Ubuntu 系统中使用到这些 Windows 的软件呢?答案是安装 wine。 简单的安装步骤如…

在Windows安装R语言

直接安装R语言软件 下载网址:R: The R Project for Statistical Computing 下载点击install R for the first time 通过Anaconda下载RStudio 提前下载好Anaconda 点击Anaconda Navigate 点击RStudio的Install下载就好了

Python:可迭代对象与迭代器

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 根据Python官方文档,可迭代对象(iterable)是“一种能够逐个返回其成员项的对象”。具体来说,这种对象要么定义了一个返回迭代器(iterator)的魔术…

如何实现Windows RDP 远程桌面异地跨网连接

Windows RDP远程桌面的应用非常广泛。远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或本地计算机)连上提供微软终端机服务的计算机(称为服务端或远程计算机)。大部分的Windows版本都有用户端所需软件,有些其他操作…

太阳能路灯光伏板的朝向设计问题

题目:太阳能路灯光伏板的朝向设计问题 难度对标几乎每一年的国赛A题。 QQ群:592697532 公众号:川川菜鸟 文章目录 背景问题问题一问题二问题三 题目解读相关公式(必备)太阳辐射的计算光伏板接收的辐射光学效率大 气透…

数据结构(顺序栈

目录 1. 讲解:2. C代码实现:小结: 1. 讲解: 用顺序的物理结构(数组)存储栈这个数据结构,实现栈的创建、销毁、增删查、判空。 top指针的指向位置有两种实现方法:一个是指向栈顶元素…

云服务器部署Springboot项目

前端项目打包 修改ip地址 在控制台输入npm run build:prod 会产生dist文件 将dist文件中的内容移动至/usr/local/nginx/html目录下 后端项目打包 修改ip地址 执行clean操作 执行install操作 将生成的target文件中的jar包移动至/usr/local/src目录下 启动 注意⚠️&#xff…

前沿论文 | LLM推理性能优化最佳实践

原文:安全验证 - 知乎​ 来源 题目:LLM Inference Performance Engineering: Best Practices 地址:https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices 在这篇博文中,MosaicML工程团队分析了…

AI讲师人工智能讲师大模型培训讲师叶梓:突破大型语言模型推理效率的创新方法

大型语言模型(LLM)在自然语言处理(NLP)任务中展现出了前所未有的能力,但它们对计算资源的巨大需求限制了其在资源受限环境中的应用。SparQ Attention算法提出了一种创新的方法,通过减少注意力机制中的内存带…

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法解决方法: 1.在开发人员选项中开启USB调试 如何进入开发者选项? 设置->关于->版本号,点击版本号直至出现您已处于开发者模式 2.选择USB配置…

Github 2024-04-19Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-04-19统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1Android开发者实用工具集 创建周期:2820 天开发语言:Java协议类型:Apache License 2.0Star数量:32909 个Fork数量:10631…

北大字节联合发布视觉自动回归建模(VAR):通过下一代预测生成可扩展的图像

北大和字节发布一个新的图像生成框架VAR。首次使GPT风格的AR模型在图像生成上超越了Diffusion transformer。 同时展现出了与大语言模型观察到的类似Scaling laws的规律。在ImageNet 256x256基准上,VAR将FID从18.65大幅提升到1.80,IS从80.4提升到356.4,推理速度提高了20倍。 相…

设计模式——策略模式20

策略模式是一种行为设计模式, 它能让你定义多种算法或行为方式, 并将具体实现放入独立的类中, 以使算法的对象能够相互替换。使用场景例如活动中多种打折策略。 策略抽象 /*** author ggbond* date 2024年04月18日 08:02*/ public interfa…

Linux 系统下的进程间通信 IPC 入门 「中」

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/39XQUQtGC3Ow-0s0JKWnog 信号量 信号量一般用于配合共享内存的数据传输,共享内存被多个进程之间共享访问,各个进程对共享…

Arcade 用户界面textarea

# 导入所需库 import arcade import arcade.gui# 创建窗口类 class MyWindow(arcade.Window):# 初始化方法def __init__(self):super().__init__(800, 600, "GUI Widgets Example", resizableTrue)# 创建UI管理器,用于处理UI元素self.manager arcade.gui…

2024Mathorcup数学应用挑战赛C题|图神经网络的预测模型+ARIMA时间序列预测模型+人员排班混合整数规划模型|完整代码和论文全解全析

2024Mathorcup数学应用挑战赛C题|图神经网络的预测模型ARIMA时间序列预测模型人员排班混合整数规划模型|完整代码和论文全解全析 我们已经完成了2024Mathorcup数学建模挑战赛C题的40页完整论文和代码,相关内容可见文末,部分图片如下: 问题分…
最新文章