MySQL Innodb存储引擎中,当页默认的大小是16K时,页中最多存放多少行的记录?

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)

相关推荐

  1. MySQL一行记录怎么存储

    2024-07-10 06:54:01       37 阅读
  2. MySQL 常用存储引擎

    2024-07-10 06:54:01       41 阅读
  3. MySQL 事务和存储引擎

    2024-07-10 06:54:01       38 阅读
  4. MySQLInnoDB引擎数据过大对B+树存储影响

    2024-07-10 06:54:01       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 06:54:01       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 06:54:01       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 06:54:01       90 阅读
  4. Python语言-面向对象

    2024-07-10 06:54:01       98 阅读

热门阅读

  1. 通信技术在反无人机中的作用分析

    2024-07-10 06:54:01       33 阅读
  2. FastGPT源码部署,不使用docker

    2024-07-10 06:54:01       30 阅读
  3. 【ROS2】中级-编写动作服务器和客户端(Python)

    2024-07-10 06:54:01       24 阅读
  4. 等保测评视角下的哈尔滨智慧城市安全框架构建

    2024-07-10 06:54:01       33 阅读
  5. 如何判断服务器是否被攻击

    2024-07-10 06:54:01       25 阅读
  6. Go中gin框架的*gin.Context参数常见实用方法

    2024-07-10 06:54:01       28 阅读
  7. qt writeDatagram 函数详解

    2024-07-10 06:54:01       49 阅读
  8. CSS - 深入理解选择器的使用方式

    2024-07-10 06:54:01       39 阅读
  9. 基于gunicorn+flask+docker模型高并发部署

    2024-07-10 06:54:01       25 阅读