這些效能提示補充了第 10.2.5.1 節「最佳化 INSERT 陳述式」中快速插入的一般指南。
當匯入資料到
InnoDB
時,請關閉自動提交模式,因為它會為每個插入執行磁碟記錄刷新。若要在匯入作業期間停用自動提交,請使用SET autocommit
和COMMIT
陳述式將其包圍SET autocommit=0; ... SQL import statements ... COMMIT;
mysqldump 選項
--opt
建立的傾印檔案可以快速匯入InnoDB
表格,即使不使用SET autocommit
和COMMIT
陳述式將其包圍也一樣。如果次要索引鍵上有
UNIQUE
限制,您可以在匯入期間暫時關閉唯一性檢查來加速表格匯入SET unique_checks=0; ... SQL import statements ... SET unique_checks=1;
對於大型表格,這會節省大量的磁碟 I/O,因為
InnoDB
可以使用其變更緩衝區來批量寫入次要索引記錄。請確保資料不包含重複的索引鍵。如果表格中有
FOREIGN KEY
限制,您可以在匯入期間關閉外部索引鍵檢查來加速表格匯入SET foreign_key_checks=0; ... SQL import statements ... SET foreign_key_checks=1;
對於大型表格,這可以節省大量的磁碟 I/O。
如果您需要插入多個列,請使用多列
INSERT
語法來減少用戶端和伺服器之間的通訊負擔INSERT INTO yourtable VALUES (1,2), (5,5), ...;
此提示適用於任何表格的插入,而不僅僅是
InnoDB
表格。當對具有自動遞增欄位的表格進行大量插入時,請將
innodb_autoinc_lock_mode
設定為 2(交錯)而非 1(連續)。詳情請參閱第 17.6.1.6 節,「InnoDB 中的 AUTO_INCREMENT 處理」。執行大量插入時,以
PRIMARY KEY
順序插入資料列會比較快。InnoDB
表格使用叢集索引,這使得以PRIMARY KEY
的順序使用資料相對較快。對於無法完全容納在緩衝池中的表格,以PRIMARY KEY
順序執行大量插入尤其重要。為了在將資料載入
InnoDB
FULLTEXT
索引時獲得最佳效能,請遵循以下步驟在建立表格時定義一個
FTS_DOC_ID
欄位,類型為BIGINT UNSIGNED NOT NULL
,並具有名為FTS_DOC_ID_INDEX
的唯一索引。例如CREATE TABLE t1 ( FTS_DOC_ID BIGINT unsigned NOT NULL AUTO_INCREMENT, title varchar(255) NOT NULL DEFAULT '', text mediumtext NOT NULL, PRIMARY KEY (`FTS_DOC_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on t1(FTS_DOC_ID);
將資料載入表格。
在資料載入後建立
FULLTEXT
索引。
注意當在建立表格時新增
FTS_DOC_ID
欄位時,請確保在更新FULLTEXT
索引欄位時更新FTS_DOC_ID
欄位,因為FTS_DOC_ID
必須隨著每個INSERT
或UPDATE
而單調遞增。如果您選擇不在建立表格時新增FTS_DOC_ID
,並讓InnoDB
為您管理 DOC ID,則InnoDB
會在下一次呼叫CREATE FULLTEXT INDEX
時,將FTS_DOC_ID
作為隱藏欄位新增。然而,這種方法需要重建表格,這可能會影響效能。如果將資料載入新的 MySQL 執行個體,請考慮使用
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
語法停用重做日誌記錄。停用重做日誌記錄有助於加快資料載入速度,因為避免了重做日誌寫入。如需更多資訊,請參閱停用重做日誌記錄。警告此功能僅適用於將資料載入新的 MySQL 執行個體。請勿在生產系統上停用重做日誌記錄。允許在停用重做日誌記錄時關閉並重新啟動伺服器,但是,在停用重做日誌記錄時意外停止伺服器可能會導致資料遺失和執行個體損毀。
使用 MySQL Shell 匯入資料。MySQL Shell 的平行表格匯入工具
util.importTable()
可為大型資料檔案快速將資料匯入到 MySQL 關聯式表格。MySQL Shell 的傾印載入工具util.loadDump()
也提供平行載入功能。請參閱MySQL Shell 工具。