推荐阅读
- 学习笔记 《 深入理解 Java 虚拟机》
- 学习笔记 《 后端架构设计》
- 学习笔记 《 Java 基础知识进阶》
- 学习笔记 《 Nginx 学习笔记》
- 学习笔记 《 前端开发杂记》
- 学习笔记 《 设计模式学习笔记》
- 学习笔记 《 DevOps 最佳实践指南》
- 学习笔记 《 Netty 入门与实战》
- 学习笔记 《 高性能MYSQL》
- 学习笔记 《 JavaEE 常用框架》
- 学习笔记 《 Java 并发编程学习笔记》
- 学习笔记 《 分布式系统》
- 学习笔记 《 数据结构与算法》
文章目录
1、索引组织表
在InnoDB 存储引擎中,表都是按照主键顺序组织存放的,这种存储方式称之为所以组织表(Index Origanized Table)。在InnoDB 中每个表都有主键索引,如果没有显式的定义主键,那么则会按照下面的规则选择或者创建主键。
- 首先判断表结构中是够有唯一非空索引,如果有则以该索引为主键。
-- 并未显式的指定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 | |
+--------+--------------+------+-----+---------+-------+
- 如果没有符合条件的字段,那么InnoDB 存储引擎会自动创建一个6个字节的大小的指针.
2、InnoDB 逻辑存储结构
从InnoDB 存储引擎的逻辑存储结构上看,所有的数据被逻辑的存储在一个空间(物理上并不一定连续),称之为表空间(TableSpace)。表空间又由段(Segement)、区(Extent)、页(Page)、行(Row)组成。
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中,常见的页的类型有
- 数据页 B-tree Node
- Undo页 undo Log Page
- 系统页 System Page
- …
-
2.5 行 (Row)
前面提到 InnoDB 存储引擎是面向列存储的。每个页所防的数量约为16Kb/2-200行,也就是7992 行记录。
3、InnoDB 行记录格式
InnoDB存储引擎和大多数数据库存储引擎类似,记录是按照行存储的,这意味着页中保存者一行行的记录。在早期的InnoDB版本中,由于行格式只有一种,因此不需要为此行格式命名。随着InnoDB引擎的发展,开发出了不兼容早期版本的新行格式,用于支持新的功能。为了在升级和降级情况下帮助管理系统的兼容性,以及运行不同的MySQL版本,InnoDB开始使用命名的行格式。
通过语句 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)
行格式的细致说明,个人觉得对于开发人员而言不是太重要,因此这里略过对不同行格式的说明。