第五节:从一条记录说起——InnoDB记录结构

《MySQL 是怎样运行的:从根儿上理解 MySQL》第五节:从一条记录说起——InnoDB记录结构

准备工作

    现在只知道客户端发送请求并等待服务器返回结果。
    MySQL什么方式来访问这些数据?
    MySQL服务器上负责对表数据的读取和写入工作的部分是存储引擎。
    什么格式存放?
    真实的数据在不同存储引擎中存放的格式一般是不同的。

InnoDB页简介

    InnoDB将数据划分为若干个页,以页作为磁盘和内存的交互的基本单位,InnoDB也的大小一般为16KB。    

InnoDB行格式

    InnoDB存储引擎有四种不用类型的行个格式,Compact、Redundant、Dynamic和Compressed行格式
    指定行格式的语法
        CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
        ALTER TABLE 表名 ROW_FORMAT=行格式名称
        案例:
            CREATE TABLE record_format_demo (
                  c1 VARCHAR(10),
                  c2 VARCHAR(10) NOT NULL,
                  c3 CHAR(10),
                  c4 VARCHAR(10)
            )CHARSET=ASCII ROW_FORMAT=COMPACT;
    COMPACT行格式
        一行记录包含
            记录的额外信息
                变长字段长度列表:
                    记录每个变长列数据占用的字节长度,倒叙存放。
                    WML记录,还要再学习。
                    可以不需要,比如:表的每个列都不是变长的数据类型就没有。
                NULL值列表:
                    首先统计允许从存储NULL的列,主键列、被NOT NULL修饰的列不可以存储NULL值。
                    表中么有允许NULL值的列,NULL值列表也就不存在了。
                    允许存储NULL的列对应一个二进制位。
                        二进制位的值为1,表示该列值为NULL。
                        二进制位的值为0,表示该列值不为NULL。
                    二进制位按照逆序排列,第一个列和最后一个二进制位对应。
                    MySQL规定NULL值列表必须用整数个字节位表示,如果使用的二进制位不是整数个字节,则在高位补0
                记录头信息:
                    五个固定字节组成,其他后面学习。
            记录的真实数据
                隐藏列,除了真实数据MySQL还会添加三个隐藏列。
                    row_id:可选。在没有主键,也没有定义unique键的列,InnoDB才会为表添加。
                    transaction_id:必选,事物ID
                    roll_pointer:必选,回滚指针
                数据列
                    非变成字段,没存储地方,空格字符填充。
                    存储为null的列,在前面的NULL值列表中有存储,不会再记录,节省空间。
        CHAR(M)列的存储格式
            列采用定长字符集,该列占用的字节数不会被加到变长字段长度列表,
            如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表。
            用字符集最大的字节占空间,防止后面修改数据需要的空间变大而重新分配空间导致碎片。
    Redundant行格式:MySQL5.0以前的一种行格式(没多看 略)
        一行记录包含
            记录的额外信息
                字段长度偏移列表
                    没有变长,说明会记录所有的列(包括隐藏列)。
                    偏移:表示它是采用两个相邻值的差值来计算各个列值的长度。
                记录头信息
                    
            记录真实数据

行溢出数据,不太理解,后面再学习一次。

        VARCHAR(M)最多能存储的数据?
            计算方式不太理解,后面再学习一次。
        记录数据太多产生的溢出
            一个页的大小一般是16kb,也就是16384字节,可能一行记录超过16384个字节。

作者总结

    1.页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位。
    2.指定修改行格式的语法如下:
        CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
        ALTER TABLE 表名 ROW_FORMAT=行格式名称
    3.InnoDB现在定义了4种行格式
        一个也一般是16KB,当记录中的数据太多,当前也放不下的时候,会把多余的数据存储到其他页中,称为行溢出。

脑图地址:方便有需要的同学高清看
http://naotu.baidu.com/file/a0133241fae5042adac6387c7a2a4a7b?token=fb9dfd8fefbdc019





转载于:https://www.cnblogs.com/jtfr/p/11186240.html

### 回答1: 确实,MySQL的varchar类型在InnoDB存储引擎中的存储结构比较复杂。在InnoDB中,每个记录都被存储为一个B+树节点,每个节点都有一个固定大小的页,通常为16KB。 当一个varchar类型的列被插入到InnoDB表中时,它会被拆分成两个部分:一个是实际的数据,另一个是长度信息。长度信息会被存储在记录头中,而实际的数据会被存储在记录的数据页中。 在InnoDB中,如果一个varchar类型的列的长度小于等于768个字节,那么它会被存储在记录的数据页中。如果一个varchar类型的列的长度超过了768个字节,那么它会被存储在单独的页中,并且在记录中只存储一个指向这个页的指针。 此外,由于InnoDB使用了行级锁定,每个记录都需要存储一个事务ID,用于实现MVCC(多版本并发控制)。因此,在InnoDB中,每个记录头还需要存储一个6字节的事务ID和一个2字节的回滚指针。 综上所述,当使用varchar类型时,需要注意其实际数据的长度和存储引擎的存储结构,以便更好地设计表结构和查询语句。 ### 回答2: MySQL的varchar存储结构确实是相当深奥的。在InnoDB存储引擎中,varchar类型的数据存储在表的记录中,其存储结构会影响数据写入、存储空间占用和查询性能。 首先,varchar类型的数据在记录中是以变长字符串的形式进行存储的。这意味着,varchar字段占用的存储空间与其实际存储的数据长度相关,而不是固定的。相比之下,固定长度的数据类型(如char)在存储时会占用固定的存储空间,无论实际数据的长度是多少。 其次,varchar类型的数据在记录中的存储格式是由一个表示长度的字节和真实字符串数据构成的。这个长度字段用于指示存储的实际数据的长度,使得数据库可以根据需要动态地分配存储空间,从而节省了存储空间。 此外,在InnoDB存储引擎中,varchar字段的数据存储在页内部的某个位置,而不是直接存储在页上。这是由于InnoDB采用了B+树的数据结构来组织数据,为了节省存储空间和提高数据访问效率,varchar字段的数据会被存储在叶子节点中。这样一来,在查询时可以更快地遍历和定位数据,提高查询性能。 综上所述,MySQL的varchar存储结构的深度体现在其变长存储方式、长度字段和数据存储位置等方面。了解和理解这些存储结构对于正确使用varchar类型的字段、优化存储空间和提高查询性能都是非常重要的。 ### 回答3: MySQL的varchar存储结构InnoDB引擎中确实是一个很深入的话题。InnoDB引擎是MySQL的默认引擎,它采用了B+树索引来存储数据。在InnoDB记录存储结构中,varchar类型字段经过了一系列处理。 首先,InnoDB将每个记录分为固定长度部分和变长长度部分。varchar字段属于变长长度部分。对于varchar字段,MySQL会额外存储一个指针,指向数据存储区域。 其次,在实际存储varchar字段值时,InnoDB会使用两种方式。对于较短的varchar字段值,会直接将其存储在记录的数据域中。这样做的好处是可以减少额外的存储开销。 而对于较长的varchar字段值,InnoDB会将其存储在一个称为“Overflow Page”的额外存储空间中。Overflow Page的指针存储在记录的数据域中。Overflow Page与主记录有一个单独的物理连接。 另外,需要注意的是,在InnoDB中,varchar字段的长度是可变的,存储的最大长度由定义时的最大长度决定。这与char字段是不同的,char字段的长度是固定的。 总之,MySQL的varchar存储结构InnoDB引擎中是相对复杂的。它采用了不同的存储方式来处理不同长度的字段值,既保证了数据的存储效率,又满足了灵活性的要求。对于开发人员来说,了解varchar存储结构对于正确使用和优化数据库非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值