这些性能提示补充了快速插入的通用指南,见第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
索引。
Note在表创建时添加
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
。禁用重做日志记录可以加速数据加载,因为它避免了重做日志写入。有关更多信息,请参阅 禁用重做日志记录。Warning此功能仅适用于将数据加载到新的 MySQL 实例中。请勿在生产系统上禁用重做日志记录。 在禁用重做日志记录时,可以关闭并重新启动服务器,但是在禁用重做日志记录时如果服务器意外停止可能会导致数据丢失和实例损坏。
-
使用 MySQL Shell 导入数据。MySQL Shell 的并行表导入实用程序
util.importTable()
提供了快速导入大型数据文件到 MySQL 关系表的功能。MySQL Shell 的转储加载实用程序util.loadDump()
也提供了并行加载功能。请参阅 MySQL Shell 实用程序。