MySQL innodb是如何存数据的?

Mysql数据库InnoDB引擎详解 page页 >>> page Directory分组 >>> 记录(额外/真实信息)page页为InnoDB数据库引擎作为磁盘和内存之间交互的基本单位,一个页的大小一般是16KBpage Directory分组,为解决数据量大时查询遍历慢,所以将记录进行打包存储方便快速定位数据进行查询及操作记录为数据最小单位,每条记录存储真实数据与额外数据,将所有数据用指针进行串联。 阅读详情

前言

如果你使用过mysql数据库,对它的存储引擎: innodb ,一定不会感到陌生。

众所周知,在mysql5以前,默认的存储引擎是:myslam。但mysql5之后,默认的存储引擎已经变成了:innodb,它是我们建表的首选存储引擎。

那么,问题来了:

  1. innodb底层是如何存储数据的?

  2. 表中有哪些隐藏列?

  3. 用户记录之间是如何关联起来的?

如果你想知道上面三个问题的答案,那么,请继续往下面看。

本文主要包含如下内容:

1.磁盘or内存?

1.1 磁盘

数据对系统来说是非常重要的东西,比如:用户的身份证、手机号、银行号、会员过期时间、积分等等。一旦丢失,会对用户造成很大的影响。

那么问题来了,如何才能保证这些重要的数据不丢呢?

答案:把数据存在磁盘上。

当然有人会说,如果磁盘坏了怎么办?

那就需要备份,或者做主从了。。。

好了,打住,这不是今天的重点。

言归正传。

大家都知道,从磁盘上读写数据,至少需要两次IO请求才能完成。一次是读IO,另一次是写IO。

而IO请求是比较耗时的操作,如果频繁的进行IO请求势必会影响数据库的性能。

那么,如何才能解决数据库的性能问题呢?

1.2 内存

把数据存在寄存器?

没错,操作系统从寄存器中读取数据是最快的,因为它离CPU最近。

但是寄存器有个非常致命的问题是:它只能存储非常少量的数据,设计它的目的主要是用来暂存指令和地址,并非存储大量用户数据的。

这样看来,只能把数据存在内存中了。

因为内存同样能满足我们,快速读取和写入数据的需求,而且性能是非常可观的,只是比较寄存器稍稍慢了一丢丢而已。

不过有个让人讨厌的地方是,内存相对于磁盘来说,是更加昂贵的资源。通常情况下,500G或者1T的磁盘,是很常见的。但你有听说过有500G的内存吗?别人会以为你疯了。内存大小讨论的数量级一般是16G或32G。

内存可以存储一些用户数据,但无法存储所有的用户数据,因为如果数据量太大了,它可能还是存不下。

此外,即使用户数据能刚好存在内存,以后万一有一天,数据库服务器或者部署节点挂了,或者重启了,数据不就丢了?

怎么做,才能不会因为异常情况,而丢数据。同时,又能保证数据的读写速度呢?

2.数据页

我们可以把一批数据放在一起。

写操作时,先将数据写到内存的某个批次中,然后再将该批次的数据一次性刷到磁盘上。如下图所示:

读操作时,从磁盘上一次读一批数据,然后加载到内存当中,以后就在内存中操作。如下图所示:

将内存中的数据刷到磁盘,或者将磁盘中的数据加载到内存,都是以批次为单位,这个批次就是我们常说的: 数据页 。

当然innodb中存在多种不同类型的页,数据页只是其中一种,我们在这里重点介绍一下数据页。

那么问题来了,什么是数据页?

数据页主要是用来存储表中记录的,它在磁盘中是用双向链表相连的,方便查找,能够非常快速得从一个数据页,定位到另一个数据页。

很多时候,由于我们表中的数据比较多,在磁盘中可能存放在多个数据页当中。

有一天,我们要根据某个条件查询数据时,需要从一个数据页找到另一个数据页,这时候的双向链表就派上大用场了。磁盘中各数据页的整体结构如下图所示:

通常情况下,单个数据页默认的大小是 16kb 。当然,我们也可以通过参数: innodb_page_size ,来重新设置大小。不过,一般情况下,用它的默认值就够了。

好吧,数据页的整体结构已经搞明白了。

那么,单个数据页包含哪些内容呢?

从上图中可以看出,数据页主要包含如下几个部分:

  • 文件头部

  • 页头部

  • 最大和最小记录

  • 用户记录

  • 空闲空间

  • 页目录

  • 文件尾部

3.用户记录

对于新申请的数据页,用户记录是空的。当插入数据时,innodb会将一部分 空闲空间 分配给用户记录。

用户记录是innodb的重中之重,我们平时保存到数据库中的数据,就存储在它里面。那么,它里面又包含哪些内容呢?你不好奇吗?

其实在innodb支持的数据行格式有四种:

  1. compact行格式

  2. redundant行格式

  3. dynamic行格式

  4. compressed行格式

我们以compact行格式为例:

一条用户记录主要包含三部分内容:

  1. 记录额外信息,它包含了变长字段、null值列表和记录头信息。

  2. 隐藏列,它包含了行id、事务id和回滚点。

  3. 真正的数据列,包含真正的用户数据,可以有很多列。

下面让我们一起了解一下这些内容。

3.1 额外信息

额外信息并非真正的用户数据,它是为了辅助存数据用的。

3.1.1 变长字段列表

有些数据如果直接存会有问题,比如:如果某个字段是varchar或text类型,它的长度不固定,可以根据存入数据的长度不同,而随之变化。

如果不在一个地方记录数据真正的长度,innodb很可能不知道要分配多少空间。假如都按某个固定长度分配空间,但实际数据又没占多少空间,岂不是会浪费?

所以,需要在变长字段中记录某个变长字段占用的字节数,方便按需分配空间。

3.1.2 null值列表

数据库中有些字段的值允许为null,如果把每个字段的null值,都保存到用户记录中,显然有些浪费存储空间。

有没有办法只简单的标记一下,不存储实际的null值呢?

答案:将为null的字段保存到null值列表。

在列表中用二进制的值1,表示该字段允许为null,用0表示不允许为null。它只占用了1位,就能表示某个字符是否为null,确实可以节省很多存储空间。

3.1.3 记录头信息

记录头信息用于描述一些特殊的属性。

它主要包含:

  • deleted_flag:即删除标记,用于标记该记录是否被删除了。

  • min_rec_flag:即最小目录标记,它是非叶子节点中的最小目录标记。

  • n_owned:即拥有的记录数,记录该组索引记录的条数。

  • heap_no:即堆上的位置,它表示当前记录在堆上的位置。

  • record_type:即记录类型,其中:0表示普通记录,1表示非叶子节点,2表示Infrimum记录, 3表示Supremum记录。

  • next_record:即下一条记录的位置。

3.2 隐藏列

数据库在保存一条用户记录时,会自动创建一些隐藏列。如下图所示:

目前innodb自动创建的隐藏列有三种:

  • db_row_id,即行id,它是一条记录的唯一标识。

  • db_trx_id,即事务id,它是事务的唯一标识。

  • db_roll_ptr,即回滚点,它用于事务回滚。

如果表中有主键,则用主键做行id,无需额外创建。如果表中没有主键,假如有不为null的unique唯一键,则用它做为行id,同样无需额外创建。

如果表中既没有主键,又没有唯一键,则数据库会自动创建行id。

也就是说在innodb中,隐藏列中 事务id 和 回滚点 是一定会被创建的,但行id要根据实际情况决定。

3.3 真正数据列

真正的数据列中存储了用户的真实数据,它可以包含很多列的数据。这个比较简单,没有什么好多说的。

3.4 用户记录是如何相连的?

通过上面介绍的内容,大家对一条用户记录是如何存储的,应该有了一定的认识。

但问题来了,一条用户记录和另一条用户记录是如何相连的,innodb是怎么知道,某条记录的下一条记录是谁?

答案是:用前面提到过的, 记录额外信息 》 记录头信息 》下一条记录的位置。

多条用户记录之间通过 下一条记录的位置 ,组成了一个单向链表。这样就能从前往后,找到所有的记录了。

4.最大和最小记录

从上面可以得知,在一个数据页当中,如果存在多条用户记录,它们是通过 下一条记录的位置 相连的。

不过有个问题:如果才能快速找到最大的记录和最小的记录呢?

这就需要在保存用户记录的同时,也保存最大和最小记录了。

最大记录保存到Supremum记录中。

最小记录保存在Infimum记录中。

在保存用户记录时,数据库会自动创建两条额外的记录:Supremum 和 Infimum。它们之间的关系,如下图所示:

从图中可以看出用户数据是从最小记录开始,通过下一条记录的位置,从小到大,一步步查找,最后找到最大记录为止。

5.页目录

从上面可以看出,如果我们要查询某条记录的话,数据库会从最小记录开始,一条条查找所有记录。如果中途找到了,则直接返回该记录。如果一直找到最大记录,还没有找到想要的记录,则返回空。

咋一看,没有问题。

但如果仔细想想。

效率会不会有点低?

这不是要对整页用户数据进行扫描吗?

有没有更高效的方法?

这就需要使用 页目录 了。

说白了,就是把一页用户记录分为若干组,每一组的最大记录都保存到一个地方,这个地方就是 页目录 。每一组的最大记录叫做 槽 。

由此可见,页目录是有多个槽组成的。所下图所示:

假设一页的数据分为4组,这样在页目录中,就对应了4个槽,每个槽中都保存了该组数据的最大值。

这样就能通过二分查找,比较槽中的记录跟需要找到的记录的大小。如果用户需要查找的记录,小于当前槽中的记录,则向上查找上一个槽。如果用户需要查找的记录,大于当前槽中的记录,则向下查找下一个槽。

如此一来,就能通过二分查找,快速的定位需要查找的记录了。

so easy

6.文件头部和尾部

6.1 文件头部

通过前面介绍的行记录中 下一条记录的位置 和 页目录 ,innodb能非常快速的定位某一条记录。但有个前提条件,就是用户记录必须在同一个数据页当中。

如果用户记录非常多,在第一个数据页找不到我们想要的数据,需要到另外一页找该怎么办呢?

这时就需要使用 文件头部 了。

它里面包含了多个信息,但我只列出了其中4个最关键的信息:

  1. 页号

  2. 上一页页号

  3. 下一页页号

  4. 页类型

顾名思义,innodb是通过页号、上一页页号和下一页页号来串联不同数据页的。如下图所示:

不同的数据页之间,通过上一页页号和下一页页号构成了双向链表。这样就能从前向后,一页页查找所有的数据了。

此外,页类型也是一个非常重要的字段,它包含了多种类型,其中比较出名的有:数据页、索引页(目录项页)、溢出页、undo日志页等。

6.2 文件尾部

我之前提过,数据库的数据是以数据页为单位,加载到内存中,如果数据有更新的话,需要刷新到磁盘上。

但如果某一天比较倒霉,程序在刷新到磁盘的过程中,出现了异常,比如:进程被kill掉了,或者服务器被重启了。

这时候数据可能只刷新了一部分,如何判断上次刷盘的数据是完整的呢?

这就需要用到 文件尾部 。

它里面记录了页面的 校验和 。

在数据刷新到磁盘之前,会先计算一个页面的校验和。后面如果数据有更新的话,会计算一个新值。文件头部中也会记录这个校验和,由于文件头部在前面,会先被刷新到磁盘上。

接下来,刷新用户记录到磁盘的时候,假设刷新了一部分,恰好程序出现异常了。这时,文件尾部的校验和,还是一个旧值。数据库会去校验,文件尾部的校验和,不等于文件头部的新值,说明该数据页的数据是不完整的。

7.页头部

通过上面介绍的内容,数据页之间能够轻松访问了,但剩下还有个比较重要的问题,就是记录的状态信息。

比如一页数据到底保存了多条记录,或者页目录到底使用了多个槽等。这些信息是实时统计,还是事先统计好了,保存到某个地方?

为了性能考虑,上面的这些统计数据,当然是先统计好,保存到一个地方。后面需要用到该数据时,再读取出来会更好。这个保存统计数据的地方,就是 页头部 。

当然页头部不仅仅只保存:槽的数量、记录条数等信息。

它还记录了:

  • 已删除记录所占的字节数

  • 最后插入记录的位置

  • 最大事务id

  • 索引id

  • 索引层级

其实还有很多,在这里就不一一列举了,有兴趣的朋友可以找我私聊。

总结

多个数据页之间通过 页号 构成了双向链表。而每一个数据页的行数据之间,又通过 下一条记录的位置 构成了单项链表。整体架构图如下:

MySQL--- InnoDB 存储引擎 InnoDB 存储引擎,Mysql 阅读详情

相关推荐

MySQL 底层原理(面试精华)

目录1 MySQL架构1.1 架构图1.2 SQL语句执行流程2 存储引擎2.1 查看存储引擎2.2 设置存储引擎2.3 文件存储结构对比2.4 InnoDB 与 MyISAM 的比较3 数据类型3.1 CHAR 和 VARCHAR 的区别3.2 BLOB和TEXT区别4 索引4.1 定义4.3 索引的基本语法4.3 索引的优缺点4.4 MySQL索引分类4.5 B-Tree 和 B+Tree 的区别4.6 MySQL索引结构4.6.1 MyISAM主键索引与辅助索引的结构4.6.2 InnoDB主键索引

QiuHaoqian的博客 9860

Mysql之innodb

innodb

浪迹白杨的博客 2655

面试八股:MySQL InnoDB 是如何存数据的?

前言 如果你使用过 MySQL 数据库,对它的存储引擎:InnoDB,一定不会感到陌生。 众所周知,在MySQL5 以前,默认的存储引擎是:MyISAM。但MySQL5之后,默认的存储引擎已经变成了InnoDB,它是我们建表的首选存储引擎。 那么,问题来了: InnoDB 底层是如何存储数据的? 表中有哪些隐藏列? 用户记录之间是如何关联起来的? 如果你想知道上面三个问题的答案,那么,请继续往下面看。 本文主要包含如下内容: 1. 磁盘 or 内存 ...

xupeiyan的博客 284

【MySQL | 进阶篇】08、InnoDB 引擎架构、事务原理及 MVCC 讲解

InnoDB 引擎架构、事务原理及 MVCC 讲解!!!

GG Bond 的博客 1883

树莓派部署Home Assistant:打造本地化智能家居大脑

家庭自动化旨在通过技术提升居住便利性与舒适度,其核心在于中枢控制系统对各类设备的统一调度。传统云端方案虽部署简便,但存在隐私泄露、网络依赖与生态壁垒等固有缺陷。本地化部署通过将控制逻辑与数据存储于家庭内部网络,从根本上解决了这些问题,实现了数据自主、离线可用与跨品牌联动。Home Assistant作为领先的开源家庭自动化平台,结合树莓派这一低功耗、高性价比的硬件载体,为构建私有、可靠的智能家居中枢提供了成熟方案。本文以树莓派4B为例,详细阐述了从系统安装、设备集成到自动化场景创建的完整实践流程,并深入探讨

weixin_33501543的博客 376

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

mysql最多可以存多少数据_InnoDB一棵B+树可以存放多少行数据?

一个问题?InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单...

weixin_39687301的博客 140

【博弈论基础与几大经典模型】古诺模型、斯塔克尔伯格模型Stackelberg Game、价格领导模型、Bertrand模型、Sweezy模型

博弈论中经典模型☞古诺模型、斯塔克尔伯格模型、价格领导模型等

学习记录 3万+

mysql一张表最多能存多少数据_mysql B+树可以存多少数据(Innodb存储引擎)

答案是两千多万 1.该图是以名字字段建立索引,树的高度为3为例,叶子节点(第三层)的18 15…是我们存储的数据 2.B+树是以页(作为基本单位)来存储数据或者存储索引和指针 3.页是什么?如上图第一行有三个名字那个方框就是一个页当然,第二行和第三行也是 4.每页存储的数据量是16K mysql默认且可以修改,不信可自查命令 : show VARIABLES like 'inno...

weixin_39621794的博客 3625

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。

2万+

2022年灌溉试验设计与数据分析考试试题

2.表2数据为表层0~10cm的原状土离心机土壤水分特征曲线试验数据,(1)请利用R语言nls函数通过Van Genuchten方程对土壤体积含水率和土壤基质势进行拟合;(3)指明土壤基值势为-33 kPa和-1500kPa时的体积含水率。1.请根据表1数据,以灌溉模式为主区,生物炭用量为子区,利用R语言agricolae包生成裂区试验设计试验处理布置图;3.以R工具包factoextra中decathlon2数据集前10列为数据进行PCA分析,要求计算出(1)前5个主成分的特征值、特征向量;

Mrrunsen的博客 267

通俗易懂:MySQL InnoDB 是如何存数据的?(数据页存储结构详细介绍)

前言 如果你使用过 MySQL 数据库,对它的存储引擎:InnoDB,一定不会感到陌生。 众所周知,在MySQL5 以前,默认的存储引擎是:MyISAM。但MySQL5之后,默认的存储引擎已经变成了InnoDB,它是我们建表的首选存储引擎。 那么,问题来了: InnoDB 底层是如何存储数据的? 表中有哪些隐藏列? 用户记录之间是如何关联起来的? 如果你想知道上面三个问题的答案,那么,请继续往下面看。 本文主要包含如下内容: 1. 磁盘 or 内存 1....

Java搜索工程技术栈 1541

Simulink中搭建一个包含PID控制的压电陶瓷快反镜模型

这个模型只是一个基本框架,你需要根据实际的系统参数和要求进行调整和优化。希望这些步骤能帮助你在Simulink中搭建所需的模型。

AI的内部世界的博客 474

mysql最多可以存多少数据_MySQL InnoDB一棵B+树可以存放多少行数据?

优质文章,及时送达InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。下面几张图可以帮你理解最小存储单元:文件系统中一个文件大小只有1个字节,但不得不占磁盘上4KB的空间。innodb的所有数据文件(后缀为ibd的文件),他的大小始终都是16384(16k)的整数倍。...

weixin_39686634的博客 365

046篇:数据统计:分组、求和、平均值、最大最小值

本文介绍了在RPA中实现数据分组统计的方法。通过字典+循环组合,可以完成按单字段或多字段的分组聚合操作,包括求和、计数、求平均值及最大/最小值等。文章详细讲解了分组统计的原理,并提供了单级分组、多级分组的具体实现步骤,最后通过销售数据按月分组的实战案例,演示了如何从原始数据到生成汇总报表的完整流程。这些方法可以灵活应用于各类数据统计分析场景。

weixin_59649563的博客 215

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2101

mysql B+树可以存多少数据(Innodb存储引擎)

答案是两千多万 1.该图是以名字字段建立索引,树的高度为3为例,叶子节点(第三层)的18 15…是我们存储的数据 图 1-1 2.B+树是以页(作为基本单位)来存储数据或者存储索引和指针 3.页是什么?如上图第一行有三个名字那个方框就是一个页当然,第二行和第三行也是 4.每页存储的数据量是16K mysql默认且可以修改,不信可自查 命令 : show VARIABLES like ‘innodb_page_size%’ 图 1-2 16384/1024=16k 5.以bigInt 举例子 它是8个字节

weixin_47521167的博客 1818

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

索引最多可以存多少数据_MySQL:InnoDB一颗B+树可以存放多少行数据?

前言 开门见山,面对这样一个问题,你将如何作答?1千万,2千万,或者上亿条数据?具体的答案不重要,当然肯定也不会是一个固定的数目,今天我们就一起来探讨探讨这个问题。InnoDB是一种兼顾了高可靠性和高性能的通用存储引擎,它拥有诸多功能和特性,体系结构和工作原理也比较复杂。真要讲明白说透彻,不是一两篇博文能够实现的,也不是今天的重点。所以,本文不涉及太多的原理性知识,咱们就针对开头提出的问...

weixin_42401025的博客 3036

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【面试突击】MySQL InnoDB存储引擎:B+树叶子节点能存多少数据?

MySQL InnoDB叶子节点数据存储分析 InnoDB存储引擎使用B+树索引结构,其叶子节点存储完整数据行。每个叶子节点(页)固定16KB大小,能存储的行数由行大小决定: 行大小构成:包含字段数据和约20-30字节的行格式开销 典型场景: 普通表(200字节/行):每页约80行 极简表(100字节):每页约163行 大字段表(1KB):每页仅16行 B+树容量影响: 3层B+树可存储约1亿行(200字节/行) 行越大,总容量越小,树高度增加 优化建议: 拆分大字段到扩展表 选择合适的数据类型 通过SHO

不堪提 1172

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql最多可以存多少数据_面试 | MySQL InnoDB一棵B+树可以存放多少行数据?

一个问题?InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)...

weixin_39688687的博客 175

一个mysql数据表可以存多少条数据类型_MySQL:InnoDB一颗B+树可以存放多少行数据?...

前言开门见山,面对这样一个问题,你将如何作答?1千万,2千万,或者上亿条数据?具体的答案不重要,当然肯定也不会是一个固定的数目,今天我们就一起来探讨探讨这个问题。InnoDB是一种兼顾了高可靠性和高性能的通用存储引擎,它拥有诸多功能和特性,体系结构和工作原理也比较复杂。真要讲明白说透彻,不是一两篇博文能够实现的,也不是今天的重点。所以,本文不涉及太多的原理性知识,咱们就针对开头提出的问题,通过熟悉...

weixin_36370029的博客 719

mysql一张表最多能存多少数据_面试题:InnoDB中一棵B+树能存多少行数据?

阅读本文大概需要 5 分钟。作者:李平 | 来源:个人博客一、InnoDB 一棵 B+ 树可以存放多少行数据?InnoDB 一棵 B+ 树可以存放多少行数据?这个问题的简单回答是:约 2 千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从 InnoDB 索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一...

weixin_39901412的博客 468

mysql最多可以存多少数据_面试官:InnoDB中一棵B+树可以存放多少行数据?

阅读本文大概需要 6 分钟。来源:r6a.cn/fUA9InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节...

weixin_39640543的博客 153

MySQL(InnoDB)数据存储链路全景(从 SQL 到磁盘)——深入理解“数据在哪里、如何存、如何变更”

本文从“SQL 到磁盘”的角度,逐步串通 InnoDB 的存储链路:页(page)与记录的物理布局、聚簇索引与二级索引的差异、插入/更新的写路径(buffer pool、undo、redo、doublewrite)、页分裂与外溢、MVCC 的实现机制与 background tasks(purge、flush、change buffer 合并)等关键点。重点放在“谁持有数据、谁保证持久化、谁提供并发视图”三个问题上,为数据库设计与性能调优提供可操作的理解和建议。

往者之不谏 来者犹可追 1008

MySQL5:MySQL数据存储文件;MylSAM中索引和数据是两个独立的文件,它是如何通过索引找到数据呢?聚集索引/聚簇索引,InnoDB中二级索引为什么不存地址而是存键值?row ID如何理解?

MylSAM中索引和数据是两个独立的文件,它是如何通过索引找到数据呢? MylSAM的B+Tree里面,叶子节点存储的是数据文件对应的磁盘地址。所以从索引文件.MYI中找到键值后,会到数据文件.MYD中获取相应的数据记录。 在MylSAM里面,其他的索引也在这个.MYI文件里面。  非主键索引跟主键索引存储和检索数据的方式是没有任何区别的,没有主次之分,二者都是在索引文件里面找到磁盘地址,然后到数据文件里面获取数据。

郝开的博客 933

mysql 04 InnoDB记录结构

01。

qq_38757863的博客 230
上一篇: 当你请求www.baidu.com时都发生了什么?
下一篇: 你有没有在MySQL的order by上栽过跟头
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值