InnoDB
資料表使用 CREATE TABLE
陳述式建立;例如
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
當 InnoDB
定義為預設儲存引擎時 (預設情況下是如此),則不需要 ENGINE=InnoDB
子句。不過,如果要在預設儲存引擎不是 InnoDB
或未知的情況下,在不同的 MySQL 伺服器執行個體上重播 CREATE TABLE
陳述式,則 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