本節說明 InnoDB
資料表、索引、資料表空間以及 InnoDB
儲存引擎其他方面的限制。
一個資料表最多可以包含 1017 個欄位。虛擬產生的欄位也包含在此限制中。
一個資料表最多可以包含 64 個次要索引。
對於使用
DYNAMIC
或COMPRESSED
列格式的InnoDB
資料表,索引鍵首碼長度限制為 3072 位元組。對於使用
REDUNDANT
或COMPACT
列格式的InnoDB
資料表,索引鍵首碼長度限制為 767 位元組。例如,假設utf8mb4
字元集和每個字元最大 4 個位元組,則您可能會在TEXT
或VARCHAR
欄位上超過 191 個字元的欄位首碼索引中達到此限制。嘗試使用超過限制的索引鍵首碼長度會傳回錯誤。
如果您在建立 MySQL 實例時,透過指定
innodb_page_size
選項將InnoDB
頁面大小縮減為 8KB 或 4KB,則索引鍵的最大長度會根據 16KB 頁面大小的 3072 位元組限制成比例地降低。也就是說,當頁面大小為 8KB 時,索引鍵的最大長度為 1536 位元組,而當頁面大小為 4KB 時,索引鍵的最大長度為 768 位元組。適用於索引鍵首碼的限制也適用於完整欄位索引鍵。
多欄位索引最多允許 16 個欄位。超出限制會傳回錯誤。
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
最大資料列大小(不包括任何儲存在頁面外的可變長度欄位)對於 4KB、8KB、16KB 和 32KB 的頁面大小略小於頁面的一半。例如,預設
innodb_page_size
為 16KB 的最大資料列大小約為 8000 位元組。但是,對於 64KB 的InnoDB
頁面大小,最大資料列大小約為 16000 位元組。LONGBLOB
和LONGTEXT
欄位必須小於 4GB,並且包括BLOB
和TEXT
欄位的總資料列大小必須小於 4GB。如果一列的長度小於半頁,則會將整列資料儲存在頁面內。如果超過半頁,則會選擇可變長度的欄位進行外部頁外儲存,直到該列符合半頁大小,如第 17.11.2 節「檔案空間管理」所述。
儘管
InnoDB
內部支援大於 65,535 位元組的列大小,MySQL 本身對所有欄位的組合大小施加了 65,535 的列大小限制。請參閱第 10.4.7 節「資料表欄位計數和列大小限制」。最大資料表或資料表空間大小會受到伺服器檔案系統的影響,檔案系統可能會施加小於
InnoDB
所定義的內部 64 TiB 大小限制的最大檔案大小。例如,Linux 上的 ext4 檔案系統的最大檔案大小為 16 TiB,因此最大資料表或資料表空間大小會變成 16 TiB 而非 64 TiB。另一個範例是 FAT32 檔案系統,其最大檔案大小為 4 GB。如果您需要更大的系統資料表空間,請使用數個較小的資料檔案而非一個大型資料檔案來設定,或將資料表資料分散到每個資料表的檔案和一般資料表空間資料檔案中。
InnoDB
日誌檔的組合最大大小為 512GB。最小資料表空間大小略大於 10MB。最大資料表空間大小取決於
InnoDB
頁面大小。最大資料表空間大小也是資料表的最大大小。
一個
InnoDB
執行個體最多支援 2^32 (4294967296) 個資料表空間,其中少量資料表空間會保留給還原和暫存資料表。共用資料表空間最多支援 2^32 (4294967296) 個資料表。
資料表空間檔案的路徑(包括檔案名稱)不得超過 Windows 上的
MAX_PATH
限制。在 Windows 10 之前,MAX_PATH
限制為 260 個字元。自 Windows 10 版本 1607 起,常見 Win32 檔案和目錄函式移除了MAX_PATH
限制,但您必須啟用新的行為。如需與並行讀寫交易相關的限制,請參閱第 17.6.6 節「還原日誌」。