【MySQL 进阶】InnoDB 存储引擎下的表

推荐阅读


1、索引组织表



在InnoDB 存储引擎中,表都是按照主键顺序组织存放的,这种存储方式称之为所以组织表(Index Origanized Table)。在InnoDB 中每个表都有主键索引,如果没有显式的定义主键,那么则会按照下面的规则选择或者创建主键。
  1. 首先判断表结构中是够有唯一非空索引,如果有则以该索引为主键。
-- 并未显式的指定PK,InnoDB 会自动的将唯一非空索引作为主键
mysql> create table test_unique (number int unique not null,name varchar(123),age int default 0);
Query OK, 0 rows affected (0.01 sec)

mysql> desc test_unique;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| number | int(11)      | NO   | PRI | NULL    |       |
| name   | varchar(123) | YES  |     | NULL    |       |
| age    | int(11)      | YES  |     | 0       |       |
+--------+--------------+------+-----+---------+-------+



  1. 如果没有符合条件的字段,那么InnoDB 存储引擎会自动创建一个6个字节的大小的指针.

2、InnoDB 逻辑存储结构


从InnoDB 存储引擎的逻辑存储结构上看,所有的数据被逻辑的存储在一个空间(物理上并不一定连续),称之为表空间(TableSpace)。表空间又由段(Segement)、区(Extent)、页(Page)、行(Row)组成。


image.png








2.1 表空间


表空间是存储引擎逻辑结构的最高层,所有的数据存储在表空间中。如果没有开启参数 innodb_file_per_table 参数,则所有表共用一个表空间,如果参数 innodb_file_per_table = ON 则每张表的数据单独放到一个表空间内。

mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)


需要注意的是,开启单独表空间后,单独存放的有数据、索引等数据,回滚信息,事务信息等依旧存放在共享的表空间内。

2.2 段 (Segement)


表空间是由各个段组成的,常见的段有数据段,索引段,回滚段等,在B+树中,数据库即是叶子节点,索引段就是非叶子节点。在InnoDB 存储引擎中,对段的管理是由 DBMS 完成,开发人员或者DBA 不应该管理段。

2.3 区 (Extent)

区是由连续的页组成的,在任何情况下一个区的大小都是1M,为了保证区的连续性,InnoDB 会一次性申请4-5个区。在默认情况下,InnoDB 的存储引擎页有16K,也就是说一个区大约有64个连续页。

2.4 页 (Page)

同大多数数据库一样,InnoDB 也有页的概念,或者称之为块。页是InnoDB 管理的最小单元。在InnoDB 中默认快的大小为16KB,用户也可以通过 innodb_page_size 设置页的大小。若设置完成,则所有表的pageSize都是这个值,并且不能进行二次修改。在InnoDB中,常见的页的类型有

  1. 数据页 B-tree Node
  2. Undo页 undo Log Page
  3. 系统页 System Page

2.5 行 (Row)

前面提到 InnoDB 存储引擎是面向列存储的。每个页所防的数量约为16Kb/2-200行,也就是7992 行记录。

3、InnoDB 行记录格式

InnoDB存储引擎和大多数数据库存储引擎类似,记录是按照行存储的,这意味着页中保存者一行行的记录。在早期的InnoDB版本中,由于行格式只有一种,因此不需要为此行格式命名。随着InnoDB引擎的发展,开发出了不兼容早期版本的新行格式,用于支持新的功能。为了在升级和降级情况下帮助管理系统的兼容性,以及运行不同的MySQL版本,InnoDB开始使用命名的行格式。


image.png


通过语句 show table status like xxxx ,可以查询某个表的行记录格式。同时在创建表的时候,也可以通过 ROW_FORMAT 指定表的行格式。

-- MySQL 默认行格式
mysql> show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.00 sec)


查询某个表的行格式, 可以看到行格式为 Row_format: Dynamic

mysql> show table status like 'user_innodb'\G;
*************************** 1. row ***************************
           Name: user_innodb
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 8
 Avg_row_length: 2048
    Data_length: 16384
Max_data_length: 0
   Index_length: 16384
      Data_free: 0
 Auto_increment: 11
    Create_time: 2020-10-09 01:25:46
    Update_time: 2020-10-10 07:27:17
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

行格式的细致说明,个人觉得对于开发人员而言不是太重要,因此这里略过对不同行格式的说明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值