10.5.5 InnoDB 表的大量数据加载
这些性能提示补充了第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顺序使用数据变得相对快速。对于不完全适合缓冲池的表格来说,对于不完全适合缓冲池的表格,这一点尤其重要。
-
为了在加载数据到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列时,请确保在
INSERT
或UPDATE
时更新FTS_DOC_ID列,因为FTS_DOC_ID必须在每次插入或更新后增加。您可以选择在创建表时添加FTS_DOC_ID,或者让InnoDB为您管理它。在后一种情况下,在第一次创建FULLTEXT索引时,InnoDB会在隐藏列中添加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 工具。