InnoDB
表格是使用 CREATE TABLE
陳述式建立的;例如
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
當 InnoDB
定義為預設儲存引擎時,不需要 ENGINE=InnoDB
子句,預設情況下就是如此。但是,如果 CREATE TABLE
陳述式要在預設儲存引擎不是 InnoDB
或未知的不同 MySQL 伺服器實例上重新執行,則 ENGINE
子句很有用。您可以透過發出下列陳述式來判斷 MySQL 伺服器實例上的預設儲存引擎
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
預設情況下,InnoDB
表格會在每個表格的表空間中建立。若要在 InnoDB
系統表空間中建立 InnoDB
表格,請在建立表格之前停用 innodb_file_per_table
變數。若要在一般表空間中建立 InnoDB
表格,請使用 CREATE TABLE ... TABLESPACE
語法。如需詳細資訊,請參閱第 17.6.3 節「表空間」。
InnoDB
表格的列格式決定其列在磁碟上的實際儲存方式。InnoDB
支援四種列格式,每種列格式都有不同的儲存特性。支援的列格式包括 REDUNDANT
、COMPACT
、DYNAMIC
和 COMPRESSED
。DYNAMIC
列格式是預設格式。如需列格式特性的相關資訊,請參閱第 17.10 節「InnoDB 列格式」。
innodb_default_row_format
變數定義預設列格式。也可以使用 CREATE TABLE
或 ALTER TABLE
陳述式中的 ROW_FORMAT
表格選項來明確定義表格的列格式。請參閱定義表格的列格式。
建議為您建立的每個表格定義主索引鍵。在選擇主索引鍵欄時,請選擇具有下列特性的欄
由最重要的查詢參考的欄。
永遠不會留空的欄位。
永遠不會有重複值的欄位。
一旦插入後,數值幾乎不會變更的欄位。
例如,在包含人員資訊的表格中,您不會在 (firstname, lastname)
上建立主鍵,因為可能會有多個人擁有相同的姓名,姓名欄位可能會留空,而且有時人們會更改姓名。由於有這麼多限制,通常沒有明顯的欄位集合可以用作主鍵,因此您會建立一個新的數字 ID 欄位,作為主鍵的全部或一部分。您可以宣告一個自動遞增欄位,以便在插入資料列時自動填入遞增的值
# The value of ID can act like a pointer between related items in different tables.
CREATE TABLE t5 (id INT AUTO_INCREMENT, b CHAR (20), PRIMARY KEY (id));
# The primary key can consist of more than one column. Any autoinc column must come first.
CREATE TABLE t6 (id INT AUTO_INCREMENT, a INT, b CHAR (20), PRIMARY KEY (id,a));
有關自動遞增欄位的詳細資訊,請參閱第 17.6.1.6 節,「InnoDB 中的 AUTO_INCREMENT 處理」。
雖然表格在沒有定義主鍵的情況下也可以正常運作,但主鍵與效能的許多方面有關,並且對於任何大型或經常使用的表格而言,都是至關重要的設計考量。建議您始終在CREATE TABLE
陳述式中指定主鍵。如果您建立表格、載入資料,然後執行ALTER TABLE
以稍後新增主鍵,則該操作會比建立表格時定義主鍵慢得多。有關主鍵的詳細資訊,請參閱第 17.6.2.1 節,「叢集索引和次要索引」。
若要檢視 InnoDB
表格的屬性,請執行 SHOW TABLE STATUS
陳述式
mysql> SHOW TABLE STATUS FROM test LIKE 't%' \G;
*************************** 1. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2021-02-18 12:18:28
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
有關 SHOW TABLE STATUS
輸出的資訊,請參閱第 15.7.7.37 節,「SHOW TABLE STATUS 陳述式」。
您也可以透過查詢 InnoDB
Information Schema 系統表格來存取 InnoDB
表格屬性
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
TABLE_ID: 1144
NAME: test/t1
FLAG: 33
N_COLS: 5
SPACE: 30
ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
INSTANT_COLS: 0