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

news2024/9/23 17:25:13

在学习到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.coloradmin.cn/o/1606621.html

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

相关文章

Python文件处理--进阶

Python标准库文件操作相关模块: 1.使用pickle序列化 序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。我们可以使用pickle模块…

vivo怎么录屏?玩转手机新体验!(2024最新)

“最近新入手了一款vivo手机,感觉用起来真的很顺手,各种功能都很强大。昨天和朋友一起打游戏,突然想到要记录下精彩瞬间,但是找遍了手机,都没有找到录屏功能。我想请教一下各位vivo手机用户,你们通常在哪里…

亚马逊Bedrock凭借Anthropic的开创性Claude 3系列扩展了AI产品组合

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

基于SSM+Jsp+Mysql的文物管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

Vue项目实现懒加载——自用笔记

熟悉指令语法&#xff1a; <template><HomePanel title"人气推荐" sub-title"人气爆款 不容错过"><ul class"goods-list"><li v-for"item in hotList" :key"item.id"><RouterLink to"/&qu…

富文本编辑器(wangEdit)+(jquery.wordexport)实现web版在线编辑导出

小插曲&#xff1a;最开始的方向是Html5的contenteditable"true"的文档可编辑属性。只能修改文档文字内容&#xff0c;不能修改样式&#xff0c;如修改字体&#xff0c;字号&#xff0c;颜色等。于是用了第一款&#xff08;quil&#xff09;富文本插件。只能说一般&a…

接收区块链的CCF会议--ICSOC 2024 截止7.24

ICSOC是CCF B类会议&#xff08;软件工程/系统软件/程序设计语言&#xff09; 2023年长文短文录用率22% Focus Area 4: Emerging Technologies Quantum Service Computing Digital Twins 3D Printing/additive Manufacturing Techniques Blockchain Robotic Process Autom…

【CSS】盒子居中

目录 效果图 代码及其解释 补充解释 效果图 同时实现盒子与文字的居中 代码及其解释 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">#box1{width: 500px;height:…

python将xml格式文件转成png或者pdf格式

本文主要介绍运行NCCL代码时输出的xml文件该如何转成更加容易观看的图格式 如下是举例&#xff0c;服务器上的PCIE相关的topo xml 文件 <system version"1"><cpu numaid"1" affinity"ffffff00,0000ffff,ff000000" arch"x86_64&q…

【论文解读系列】从RNN/CNN到大模型全解析

论文&#xff1a;A Survey of Neural Code Intelligence: Paradigms, Advances and Beyond 地址&#xff1a;GitHub&#xff1a;https://github.com/QiushiSun/NCISurvey 文章目录 一、代码模型的发展 1.神经语言建模&#xff08;Neural Language Modeling&#xff09;时代 …

手动给docusaurus添加一个搜索

新版博客用docusaurus重构已经有些日子了&#xff0c;根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意&#xff0c;落花无情。 algolia总是不给我回复&#xff0c;我只能对着algolia的申请页面仰天长叹。 正常情况的申请 按照docusaur…

2024 年 Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识&#x1f917; 以下内容来自于李宏…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.4-1.5

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

计算机网络——DHCP协议

目录 前言 前篇 引言 设置IP地址的两种方式 DHCP协议流程 前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结&#xff0c;讲的非常好。 可以先去看一篇视频&#xff0c…

qt 开发 缩放比例问题 修复中

在日常开中&#xff0c;需要开启 高分辨率的支持&#xff0c;windows环境下&#xff0c;不是 字体缩放&#xff0c;就是分辨率模糊&#xff0c;缩放机制&#xff0c;并且开启了150%缩放&#xff0c;有点搞不明白&#xff0c;最后还是不行&#xff0c;先做个记录&#xff0c;在找…

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测(Matlab实现)

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09; 目录 【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 差异创意搜索算法&…

【位运算 拆位法 二分】3007. 价值和小于等于 K 的最大数字

本文涉及知识点 位运算 拆位法 二分查找算法合集 LeetCode3007. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。整数 num 的价值是由它的二进制表示中&#xff0c;从最低有效位开始&#xff0c;x&#xff0c;2x&#xff0c;3x&#xff0c;以此类推&#xff0c…

Ansible在macOS上的安装部署

一、安装 Ansible&#xff08;使用 Homebrew&#xff09; 安装 Homebrew&#xff08;如果尚未安装&#xff09;&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"使用 Homebrew 安装 Ansible&#x…

OWASP发布大语言模型网络安全与治理清单

当前人工智能技术面临的最大风险是大语言模型&#xff08;LLM&#xff09;和生成式人工智能技术的发展和应用速度已经远远超过了安全和治理的速度。 OpenAI、Anthropic、谷歌和微软等公司的生成式人工智能和大语言模型产品的使用正呈指数级增长。与此同时&#xff0c;开源大语…