InnoDB基础[亲测有效]

InnoDB基础[亲测有效]在InnoDB中,数据存储在磁盘上,处理数据时需要先将数据从磁盘读取,再写到内存。InnoDB采用局部性原理加载。 一、局部性原理 从磁盘读取数据时,不需要一行一行读取,而是以页为单位读取,操作系统中

InnoDB基础

  在InnoDB中,数据存储在磁盘上,处理数据时需要先将数据从磁盘读取,再写到内存。InnoDB采用局部性原理加载。

一、局部性原理
  从磁盘读取数据时,不需要一行一行读取,而是以页为单位读取,操作系统中一页4kb,InnoDB中一页16kb。
 
二、InnoDB页结构
  页是InnoDB管理存储空间的基本单位,一个页的大小默认是16KB。

三、InnoDB行格式

  一行记录可以以不同的格式存在InnoDB中,行格式分别是Compact、Redundant、Dynamic和Compressed行格式。

  我们可以在创建或修改表的语句中指定行格式:

    CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
    ALTER TABLE 表名 ROW_FORMAT=行格式名称

1、Compact行格

   InnoDB基础[亲测有效]

    (1)变长字段长度列表

  MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、TEXT类型,BLOB类型,这些数据类型修饰列称为变长字段。变长字段长度列表即所有变长字段的真实数据占用的字节长度构成的列表。

  VARCHAR(M),M代表最大能存多少个字符。

  (2)NULL标志位(列表)
  Compact行格式会把可以值为NULL的列统一管理起来,存一个二进制标记(1为NULL,0不为NULL)在NULL标志位中,如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。 

   如:第一行没有null:11111

    第二行前三位null:22 (null标志位:11100)

  (3)记录头信息

    记录头信息用于描述记录,它是由固定的5个字节组成。 5个字节也就是40个二进制位,不同的位代表不同的意思,如图: 

    InnoDB基础[亲测有效]

  (4)记录的真实数据 

    记录的真实数据除了我们自己定义的列的数据以外,还会有三个隐藏列:

代码100分

    InnoDB基础[亲测有效]

2.行溢出数据

 VARCHAR(M)类型的列最多可以占用65535个字节。 如果我们使用 ascii字符集的话,一个字符就代表一个字节。但是VARCHAR(65535)会报错:  

  InnoDB基础[亲测有效]

 

  原因:存储一个VARCHAR(M)类型的列,其实需要占用3部分存储空间: 1. 真实数据 2. 变长字段真实数据的长度 3. NULL值标识 

  因此,如果该VARCHAR类型的列没有NOT NULL属性,那最多只能存储65532个字节的数据,因为变长字段的长度占用 2个字节,NULL值标识需要占用1个字节。 

 3.行过长导致的页溢出

  一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这 样就可能出现一个页存放不了一条记录。 

   (1)在Compact和Reduntant行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分 数据,把剩余的数据分散存储在几个其他的页中,然后记录的真实数据处用20个字节存储指向这些页的「地址和字节数」,从而可以找到剩余数据所在的页。 

     InnoDB基础[亲测有效]

 

  (2)在Dynamic和Compressed行格式中,它们不会在记录的真实数据处 存储一部分数据,而是把所有的数据都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。

     InnoDB基础[亲测有效]

4.Dynamic和Compressed行格式

  这两种行格式类似于COMPACT行格式,只不过在处理行溢出数据时有点区别,如上。另外, Compressed行格式会采用压缩算法对页面进行压缩。 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9309.html

(0)
上一篇 2023-02-11
下一篇 2023-02-11

相关推荐

  • Python中的字符串大写转换方法

    Python中的字符串大写转换方法在Python中,字符串是一种非常重要的数据类型,字符串的处理对于文本处理、字符串处理等方面非常重要。其中的一个方法就是将字符串中的字母全部转换为大写形式,这对于处理某些场景,例如文本匹配、数据清洗等会非常有用。在本文中我们将介绍Python中的字符串大写转换方法,让读者了解其用法,以提高代码的可读性和可维护性。

    2024-03-03
    76
  • oracle 连接数不够解决[通俗易懂]

    oracle 连接数不够解决[通俗易懂]程序报错: java.sql.SQLException: Listener refused the connection with the following error: ORA-12519, T…

    2022-12-23
    145
  • Oracle数据库入门(二)「建议收藏」

    Oracle数据库入门(二)「建议收藏」Oracle SQL*Plus常用命令 一、SYS用户和System用户 Oracle安装会自动的生成SYS用户和System用户。 1) SYS用户时超级用户,具有最高权限,具有SYSDBA角色,有

    2023-04-30
    157
  • MySQL传统点位复制在线转为GTID模式复制「建议收藏」

    MySQL传统点位复制在线转为GTID模式复制「建议收藏」1. GTID优缺点 MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL5.7(尤其是MySQL5

    2022-12-18
    138
  • Centos7中MySQL数据库使用mysqldump进行每日自动备份「建议收藏」

    Centos7中MySQL数据库使用mysqldump进行每日自动备份「建议收藏」数据库的备份,对于生产环境来说尤为重要,数据库的备份分为物理备份和逻辑备份。我们将使用mysqldump命令进行数据备份。使用自动任务进行每日备份。

    2023-04-19
    139
  • 构建一个简单的Python网站爬虫

    构建一个简单的Python网站爬虫在互联网时代,信息已经成为了我们获取知识和娱乐的主要来源之一。然而,对于做数据分析或是有兴趣获取某些网站特定信息的用户而言,人工从网站上获取数据显然是一个非常费事费力的过程,于是,爬虫技术便应运而生。在本文中,我们将介绍如何使用Python构建一个简单但强大的网站爬虫工具,帮助您快速高效地抓取所需信息。

    2024-08-11
    24
  • 掌握Python List长度的技巧

    掌握Python List长度的技巧在Python中,List是一种基本的数据结构,它可以储存任意类型的数据,包括数字、字符串、甚至是其他的List列表等等。获取List的长度是开发过程中比较常用的操作之一,可以使用len()函数来获取List的长度。

    2023-12-29
    99
  • redis为什么比memcache快_mongodb和redis的场景

    redis为什么比memcache快_mongodb和redis的场景对比结论 1. 性能上: 性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以

    2022-12-21
    155

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注