历史遗留问题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.mzph.cn/web/320.shtml

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

相关文章

2025考研数学武忠祥强化班视频,百度网盘课程+讲义PDF更新

25考研的小伙伴们现在应该基础都学习的差不多了吧! 是时候进入强化阶段的学习啦。 2025考研数学强化班全程网盘:https://pan.baidu.com/s/1Z029fuCLkyyhIRFqd5QKcg 提取码:p3ue 晚上好,聊聊17堂课的看课攻略。 今年的17堂课还…

IP-guard WebServer 权限绕过漏洞复现(QVD-2024-14103)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

Mac下brew安装php7.4

这里作者挂了梯子,所以很流畅! brew的下载,可参考另外一篇博文~Homebrew 安装与卸载 1、将第三方仓库加入brew brew tap shivammathur/php2、安装指定版本的PHP brew install php7.43、替换Mac自带PHP环境并刷新环境变量 -> …

【ACM列表推荐会议 | EI稳定检索】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024) 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

【网站项目】新生报到系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

局域网MongoDB的数据库访问不了

局域网MongoDB的数据库访问不了 确认bindIp: 0.0.0.0后,仍然是访问不了,查询资料发现是windows自带防火墙的问题 进入到 允许其他应用,选择mongod.exe的位置 这样就好了。

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型:与门、或门和非门。 1、概述 我们还看到,数字逻辑门具有与其相反或互补的形式,分别为“与非门”、“或非门”和“缓冲器”,并且…

ansible进阶-剧本调试方法

目录 1、调试方法 2、实例 2.1 Debug模块 2.2 tags标签 2.3 忽略错误 1、调试方法 具体方法应用场景debug标签执⾏剧本的时候输出剧本的执⾏流程,⼀般配合register⼀起使⽤. 输出facts变量自定义变量tags标签给⼀些模块加上标签,运⾏剧本的时候可以运⾏指定标签的…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学,用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容,请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一:创建维护弹簧对…

MySQL 锁机制全面解析

目录 1. MySQL的锁类型1.1 全局锁1.2 表锁1.3 行锁1.4 共享锁(读锁)1.5 排它锁(写锁)1.6 死锁 2 乐观锁和悲观锁2.1 乐观锁2.2 悲观锁 3 意向锁4 间隙锁5 临键锁6. 事务隔离级别对锁的影响6.1 读未提交(Read Uncommitt…

3ds Max2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 3ds Max是一款基于PC系统的强大3D建模、渲染和制作软件,广泛应用于游戏开发、影视后期制作、建筑设计、工业设计等多个领域。其拥有丰富的建模工具,可轻松创建逼真的三维场景和模型;同时&#…

OpenMesh 极小曲面(局部迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 我们的目标是想得到一个曲率处处为0的曲面,具体操作如下所述: 二、实现代码 #define _USE_MATH_DEFINES #include

Linux 操作系统gdb、makefile

今天是对前面两天的补充和完善。 1、gdb 1.1 gdb 作用 调试程序 1.2 调试bug的步骤 测试:发现问题 固化:让bug重现 定位:找到bug的位置 修改:修改bug 验证 1.3 gdb调试工具的使用 1->想要使用gdb调试工具,在编…

【网站项目】自习室预约系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

汽车充电桩充电效率的四大决定因素

随着电动汽车的快速普及,交流充电桩作为电动汽车的充电基础设施,其充电效率受到了广泛的关注。接下来,我们将深入探讨交流充电桩的充电效率,包括充电效率的定义、影响因素以及提升方法。 充电效率的定义 交流充电桩的充电效率指的…

【微信小程序从入门到精通(项目实战)】——微电影小程序

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

2024华中杯C题完整解题思路及代码

C 题 基于光纤传感器的平面曲线重建算法建模 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技 术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号,其 基本原理是当外界环境参数发生变化时,会引起光纤传感器中光波参量&…

Vue前端框架如何调用天聚数行API?

Vue是一个业内优秀的前端解决方案,采用了最新流行的MVVM框架模式,深受web前端开发者的喜爱,在相关开发者社区也一直都是热门交流话题。那么,如何通过Vue调用天行数据的API接口呢,下面就具体给大家示例。 vue采用的是数…

数字零售力航母-看微软如何重塑媒体

数字零售力航母-看微软如何重塑媒体 - 从2024全美广播协会展会看微软如何整合营销媒体AI技术和AI平台公司 2024年,微软公司联合英伟达总司,赞助全美广播协会展会。本次展会微软通过搭建一个由全面的合作伙伴生态系统支持的可信和安全的平台,…

TCP和UDP协议的区别

1、定义 TCP协议的全称是Transmission Control Protocol(传输控制协议),是一种面向连接的点对点的传输层协议。 UDP协议的全称是User Datagram Protocal(用户数据报协议),为应用程序提供一种无需建立连接…