这些性能提示补充了快速插入的通用指南,见第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顺序尤其重要。 -
要在加载数据到
InnoDBFULLTEXT索引时获得最佳性能,请按照以下步骤操作:-
在表创建时定义一个
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 实用程序。