1、题目引入
Innodb存储引擎是面向行的(row-oriented),也就是说数据的存放按行进行,每页存放的行记录是有硬性定义的,当页默认的大小是16K时,页中最多存放多少行的记录?
- A、1600 行
- B、8192 行
- C、16383 行
- D、7992 行 ✔
2、解答
在数据库和编程语言中,tinyint、smallint、int(有时也称为integer)是三种不同大小的数据类型,用于存储整数值。它们之间的主要区别在于它们能够表示的数字范围不同,以及因此导致的存储空间需求不同。这些类型在MySQL、SQL Server、PostgreSQL等大多数关系型数据库管理系统中都存在,尽管具体的数值范围和存储需求可能略有不同,但基本概念是一致的。
-
tinyint
- 数值范围:通常是有符号的,范围从-128到127(如果定义为无符号,则是从0到255)。
- 存储空间:通常占用1个字节(8位)的存储空间。
- 用途:适用于存储非常小的整数值,如布尔值(尽管在SQL中通常使用BIT或BOOLEAN类型表示布尔值)、状态码等。
-
smallint
- 数值范围:通常是有符号的,范围从-32,768到32,767(如果定义为无符号,则是从0到65,535)。
- 存储空间:通常占用2个字节(16位)的存储空间。
- 用途:适用于存储较小的整数值,如分类ID、年龄等。
-
int 或 integer
- 数值范围:通常是有符号的,范围从-2,147,483,648到2,147,483,647(如果定义为无符号,则是从0到4,294,967,295)。
- 存储空间:通常占用4个字节(32位)的存储空间。
- 用途:适用于存储大多数整数值,如用户ID、订单数量等。
Innodb存储引擎的数据按行进行存储。一页最多的存放的行16*1024/2-200行记录,即7992行。
硬性规定每个页都要预留200字节的空间来存储页面头部信息。
- Trx_id(隐藏字段):每次对某行记录进行事务操作时,都会把对应的事务ID赋值到这个字段中
- Roll_point(隐藏字段):每次对某行记录进行修改时,都会把旧的版本写入到undolog中,然后这个隐藏列就相当于一个指针,可以通过它来找到修改前的信息
3、知识点提示
3.1、表空间(tablespace)
在MySQL中,所有InnoDB存储引擎表中的数据都存储在表空间中。如果用户启用了innodb_file_per_table,那么每张表内的数据可以存储在一个单独的表空间文件(称为独立表空间文件)中,如果没有启用,那么数据都会存储在共享表空间文件中(默认情况下的ibdata0和ibdata1文件)。
在MySQL 5.7中,innodb_file_per_table默认是启用的
mysql> show variables like 'innodb_file_%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)
独立表空间文件存放的只是这张表的数据、索引和插入缓冲Bitmap页。对于回滚信息、插入缓冲索引页、事务信息、二次写缓冲依然存放于共享表空间文件。
3.2、段(segment)
表空间由各个段组成,常见的段类型有:数据段、索引段、回滚段。
由于InnoDB表采用的是聚簇索引,聚簇索引决定了表中数据的物理存储顺序,所以数据段可以看成是B+树的叶子节点,索引段可以看成是B+树的非叶子节点。
3.3、区(extend)
一个段由多个区组成,区由多个连续页组成,每个区的大小为1MB,默认情况下,每个页的大小为16KB
mysql> show variables like 'innodb_page_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
即一个区中一共有64个连续页。用户可通过innodb_page_size参数设置每个页的大小。
默认情况下,用户在创建一张InnoDB表后,该表对应的独立表空间文件为96KB,在每个段开始时会先用32个碎片页来存放数据,使用完这32个页后才是64个连续页的申请。这么做是考虑到有些表的数据相对来说是比较少的,可以节省磁盘空间,因为申请64个页(即1个区)需要1MB空间。
3.4、页(page)
页是InnoDB磁盘管理的最小单位,默认大小为16KB。常见的页类型有:
- 数据页(B-tree Node)
- undo页(undo Log Page)
- 系统页(System Page)
- 事务数据页(Transaction system Page)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 插入缓冲空闲列表页(Insert Buffer Free List)
- 未压缩的二进制大对象页(Uncompressed BLOB Page)
- 压缩的二进制大对象页(compressed BLOB Page)
3.5、行(Row)
InnoDB存储引擎将数据按行进行存放,每个页最多存放7992行记录(16KB除以2-200),InnoDB存储引擎提供了Compact、Redundant、Compressed、Dynamic四种格式来存放行记录数据,用户可通过命令show table status like 'table_name’来查看
(root@localhost)[superdb]> select * from dept;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.01 sec)(root@localhost)[superdb]> show table status like 'dept';+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+-----------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+-----------------+
| dept | InnoDB | 10 | Dynamic | 4 | 4096 | 16384 | 0 | 0 | 0 | 41 | 2024-06-19 11:34:47 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | 员工部门表 |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+-----------------+
1 row in set (0.19 sec)