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)