MySQL—MySQL的NULL值是怎么存放的

这篇具有很好参考价值的文章主要介绍了MySQL—MySQL的NULL值是怎么存放的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

 1、MySQL数据存放在哪个文件?

        创建一个数据库会产生三种格式的文件,分别是.opt格式、.frm格式、.ibd格式。

        opt格式:用来存储当前数据库的默认字符集和字符校验规则。

        frm格式:该文件是用来保存每个表的元数据信息的,主要包含表结构定义。

        ibd格式:存放数据库的数据

2、表空间文件的结构是什么样的?

        表空间由段(segment)、区(extent)、页(page)、行(row)组成

        行:数据库表的记录都是按行进行存放的,每行记录根据不同行格式,有不同的存储结构。

        页:InnoDB 的数据是按「页」为单位来读写的,每页大小默认16k

        区:在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区为单位分配。每个区的大小为 1MB,对于 16KB 的页来说,连续的 64 个页会被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,就能使用顺序 I/O 了。

        段:表空间是由各个段组成的,段是由多个区组成的。可分为数据段、索引段和回滚段等。

 

二、innodb的compact行格式 

        innodb的compact的行格式,如下所示

MySQL—MySQL的NULL值是怎么存放的,MySQL,mysql,数据库

         可以看到行格式可以分为记录的额外信息和记录的真实数据,记录的真实数据就不再赘述了,就是记录真实的存放的数据,但是还存放三个隐藏列:row_id, trx_id, roll_pointer!

        记录的额外信息分为:记录头信息、NULL值列表、变长字段长度列表

        记录头信息:里面有delete_mask(标记是否被删除)、next_record(标记下一条记录的位置)、record_type(表示当前记录类型)。

        NULL列表:如果存在允许 NULL 值的列,则每个列对应一个二进制位,二进制位按照列的顺序逆序排列。如果NULL值列大于8个,就需要两个字节存储

        变长字段长度列表:在存储数据的时候,也要把数据占用的大小存起来,存到变长字段长度列表里面,读取数据的时候才能根据它去读取对应长度的数据。其他 TEXT、BLOB 等变长字段也是这么实现的。

三、行溢出后,MySQL是怎么处理的

        MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB,也就是 16384字节,而一个 varchar(n) 类型的列最多可以存储 65532字节,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。这个时候就会发生行溢出,多的数据就会存到另外的溢出页中。 然后会在行中用20个字节来存储溢出页的地址!

四、一些问题的回答 

MySQL 的 NULL 值是怎么存放的?

MySQL 的 Compact 行格式中会用NULL值列表来标记值为 NULL 的列,NULL 值并不会存储在行格式中的真实数据部分。NULL值列表会占用 1 字节空间,当表中所有字段都定义成 NOT NULL,行格式中就不会有 NULL值列表,这样可节省 1 字节的空间。

MySQL 怎么知道 varchar(n) 实际占用数据的大小?

MySQL的compact格式会有一个变长字段列表进行存储实际占用数据的大小

varchar(n) 中 n 最大取值为多少?

最大取值为65535-NULL值列表占用字节数-变长字段长度列表所占字节数

行溢出后,MySQL 是怎么处理的?

Compact 行格式针对行溢出的处理是这样的:当发生行溢出时,在记录的真实数据处只会保存该列的一部分数据,而把剩余的数据放在溢出页中,然后真实数据处用 20 字节存储指向溢出页的地址,从而可以找到剩余数据所在的页。文章来源地址https://www.toymoban.com/news/detail-684041.html

到了这里,关于MySQL—MySQL的NULL值是怎么存放的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql数据库忘记密码了怎么办

    本人用的mysql8版本 看到网上很多教程,什么修改配置文件my.ini。在8版本根本没用。以下是8版本解决办法。亲测可用。 1、用管理员身份打开命令行工具。(强调:管理员身份) 2、停止mysql服务: 3、输入以下命令无密码启动mysql 4、 另开一个命令行窗口,输入mysql -u root无密

    2024年02月11日
    浏览(35)
  • mysql怎么将已有的数据库拷贝为另一个数据库

    您可以使用MySQL的 CREATE DATABASE 和 CREATE TABLE 语句将已有的数据库和其表拷贝到另一个数据库中。下面是具体的步骤: 在MySQL客户端中,使用 CREATE DATABASE 语句创建一个新的空数据库。例如,如果您想将现有的数据库 source_db 拷贝到新数据库 target_db 中,可以执行以下命令: 在

    2024年02月08日
    浏览(27)
  • MySQL 数据库 group by 语句怎么优化?

    我这里创建一张订单表 复制代码 同时也在表里插了一些数据 现在我们这里执行 group by 语句 复制代码 很明显,这里就可以统计出来 每件商品一共有多少订单数据! 2.1、explain 分析 不同的数据库版本,用 explain 执行的结果并不一致,同样是上面 sql 语句 「MySQL 5.7 版本」 Extr

    2024年02月06日
    浏览(33)
  • MySQL数据库忘记密码怎么办?教你一招

    文章目录 1.以管理员身份打开cmd,关闭Mysql服务 2. 跳过密码授权登录  3.再继续以管理员身份打开一个cmd窗口,进行重置密码  4.使用新密码重新登录mysql验证  5.使用Navicat可视化工具连接Mysql Mysql数据库之前安装好了,但是突然忘记当初自己设置的登录密码了,导致使用Navi

    2024年02月04日
    浏览(46)
  • 数据库MySQL中出现乱码和表格不对齐怎么解决

    MySQL中出现乱码问题及解决办法: 情况类似: 首先进入到数据库中,命令:mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况,原因可能有以下几种: 字符集是utf-8,不能显示所有的汉字 创建

    2024年02月19日
    浏览(38)
  • python在Django中,如何使用MySQL数据库进行分页怎么实现

    在Django中,使用MySQL数据库进行分页是一个相对简单的任务。Django的ORM提供了内置的分页功能,你只需要使用Paginator类即可。以下是一个基本的示例,展示了如何在Django中使用MySQL进行分页: 首先,确保你已经安装了Django和MySQL,并且已经配置了Django项目以使用MySQL数据库。

    2024年04月29日
    浏览(35)
  • 【MySQL 】MySQL 创建数据库, MySQL 删除数据库,MySQL 选择数据库

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: 以下命令简单的演示了创建数据库的过程,

    2024年02月13日
    浏览(52)
  • 【MySQL数据库】初识MySQL数据库、安装MySQL

    在今天的数字化世界中,数据是企业和个人的重要资产。管理和存储数据变得至关重要,而 MySQL 数据库是一种备受欢迎的开源关系型数据库管理系统,它提供了稳定、可靠、高性能的数据存储解决方案。本文将介绍 MySQL 数据库的基本概念和安装过程,以便初学者能够轻松上

    2024年02月08日
    浏览(51)
  • 【MySQL数据库】MySQL数据库管理

    Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。 数据:(data)

    2024年02月08日
    浏览(37)
  • 初识MySQL数据库——“MySQL数据库”

    各位CSDN的uu们你们好呀,小雅兰好久没有更文啦,确实是心有余而力不足,最近学习的内容太难了,这篇博客又是小雅兰的新专栏啦,主要介绍的是一些MySQL数据库的知识点,下面,让我们进入初识MySQL数据库的世界吧 为什么要使用数据库 数据库与数据库管理系统 MySQL介绍

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包