首页 > 数据库 >【MySQL内核】MySQL中的表数据是如何存储的?

【MySQL内核】MySQL中的表数据是如何存储的?

时间:2024-12-15 21:10:04浏览次数:4  
标签:存储 记录 数据库 内核 MySQL NULL 变长

MySQL是基于磁盘进行数据存储的关系型数据库, 所有的数据和索引都以磁盘文件的方式存储, 在有需要时载入内存读取。MySQL支持多种存储引擎,不同的存储引擎保存的文件不同。

InnoDB是MySQL使用最为广泛的存储引擎,下面我们以InnoDB引擎为例来说明。

当我们创建一个数据库表时,InnoDB会创建三个文件。其中,ibd后缀的文件是对表数据和索引实际存储的文件,也称为表空间文件。

表空间文件的结构由段、区、页、和行组成。

数据库表中的记录都是按行进行存放的,每行记录根据不同的行格式,有不同的存储结构。以Compact行格式为例,一条记录的存储可以分为两部分,分别是“额外信息”和“真实数据”。 额外信息用来描述记录,分为变长字段列表、NULL值列表和记录头信息。

虽然记录是按照行来存储的,但考虑到效率,数据库的读写并不以行为单位,而是以页为单位,一个页中可以存储多个行记录。页的大小默认为16KB,也就是数据库一次最少从磁盘中读取16KB的内容到内存,一次最少把内存中16KB的内容刷新到磁盘。

区是比页大一级的存储结构,一个区会分配64 个连续的页。因为页大小默认是16KB,所以一个区的大小是 64个16KB,也就是1MB。

段由一个或多个区组成,区在文件系统是一个连续分配的空间,不过在段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。当我们创建数据表、索引的时候,就会创建对应的段,比如创建一张表时会创建一个表段,创建一个索引时会创建一个索引段。

表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。数据库由一个或多个表空间组成。

对于一行数据如何存放,我们需要重点关注变长字段和NULL值。MySQL支持一些变长的数据类型,比如varchar(n),变长字段中存储多少字节数据是不固定的,所以我们存储真实数据的时候,需要把这些数据占用的字节数也存起来。

在Compact行格式中,把所有变长字段真实数据占用的字节长度,按照记录列的逆序方式存放在记录的开头部位,形成一个变长字段长度列表。注意当数据表没有变长字段时,比如全部都是int类型字段,这时候表里的行格式就不会有变长字段长度列表。

另外,Compact行格式还会把可以为NULL的列统一管理起来,以记录列的逆序方式存放在一个NULL值列表中。标示数据是否为NULL使用一个二进制位表示,1为NULL,0为非NULL,注意,如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在。

原创 coderxiaozhi 编程十万问

标签:存储,记录,数据库,内核,MySQL,NULL,变长
From: https://www.cnblogs.com/o-O-oO/p/18608732

相关文章

  • MySQL基础 数据库表的增删改
    文章目录Mysql一、原理定义概念定义安装Mysql.......二、数据库管理2.1内置客户端操作三、数据表管理3.1内置客户端操作四、SQL-DQL概念scott用例表DQL语句Mysql一、原理定义概念定义数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算......
  • MySQL基础函数使用
    DQL中的函数#官方函数链接https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format4.1单行函数函数都是数据库提前给我们准备好的,所以我们可以直接调用,使用函数可以让指定的列计算出我们需要的数据单行函数:指的是操作一行......
  • MySQL 插入一条 SQL 语句,redo log 记录的是什么?
    MySQL插入一条SQL语句,redolog记录的内容在MySQL的InnoDB存储引擎中,redolog(重做日志)主要用来保证事务的持久性和崩溃恢复能力。redolog记录的是对数据页的物理变更,而不是SQL语句本身。当执行一条插入语句时,redolog的记录主要包括对数据页的修改信息,以及事务相关......
  • MySQL 无法远程连接?
    MySQL无法远程连接?先看清楚报错信息,一般都有解答。虽然报错信息写的有点难懂0.云服务器商防火墙与服务器防火墙请登陆你的云服务器防火墙管理web进行相关配置。服务器本身的防火墙配置可以使用:sudoufwstatusSTFW!1.mysqldeamon配置问题/etc/mysql/mysql.conf.......
  • MySQL 事务的二阶段提交是什么?
    MySQL事务的二阶段提交是什么?二阶段提交(Two-PhaseCommit,2PC)是分布式事务中的一种协调协议,用于确保多个资源(如数据库或数据节点)在事务提交时保持一致性。MySQL在存储引擎(如InnoDB)和Binlog(归档日志)之间使用二阶段提交来保证事务的一致性。在MySQL中,二阶段提交的典型场景......
  • MySQL 三层 B+ 树能存多少数据?
    MySQL三层B+树能存多少数据?MySQL的B+树索引结构广泛用于存储引擎(如InnoDB)中,用于实现高效的查询。B+树的高度和每一层的节点数量直接影响其存储能力。以下是计算三层B+树能存储的数据量的过程。B+树的存储结构概述节点大小:在InnoDB中,B+树的每个节点(页)大小通常......
  • MySQL 在设计表(建表)时需要注意什么?
    MySQL在设计表(建表)时需要注意的要点设计数据库表是MySQL开发中非常重要的一环。合理的表结构设计可以提升性能、减少存储开销,并提高维护性。以下是一些关键的注意事项:1.明确需求和数据建模在建表前,应深入了解业务需求,完成详细的数据建模。使用工具(如ER图)设计清晰的表......
  • (免费领源码)python#Django#mysql餐厅点餐管理系统06940-计算机毕设 原创
                                              目 录摘要1绪论1.1研究背景与意义1.2开发现状1.3Django框架介绍1.3论文结构与章节安排2 餐厅点餐管理系统系统分析2.1可......
  • 基于java+Springboot+MySQL微信小程序的大用户心理咨询系统设计与实现99040-计算机原
    目录1绪论1.1研究背景1.2研究现状1.3论文结构与章节安排2 基于微信小程序的大用户心理咨询系统设计与实现分析2.1可行性分析2.2系统功能分析2.3 系统用例分析2.4系统流程分析2.5本章小结3基于微信小程序的大用户心理咨询系统设计与实现总体设计......
  • MySQL 中 EXISTS 和 IN 的区别是什么?
    在MySQL中,EXISTS和IN都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别。以下是EXISTS和IN的主要区别:1.功能和用法EXISTS:EXISTS用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,EXISTS的条件为真,否则为假。EXISTS通常与SELE......