这些性能提示补充了第 10.2.5.1 节,“优化 INSERT 语句”中关于快速插入的一般准则。
当将数据导入
InnoDB
时,关闭自动提交模式,因为它会为每次插入执行日志刷新到磁盘的操作。要禁用导入操作期间的自动提交,请将其用SET autocommit
和COMMIT
语句包围SET autocommit=0; ... SQL import statements ... COMMIT;
mysqldump 选项
--opt
会创建转储文件,这些文件即使没有用SET autocommit
和COMMIT
语句包围,也能快速导入到InnoDB
表中。如果在辅助键上具有
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
会将FTS_DOC_ID
添加为隐藏列,并使用下一次CREATE FULLTEXT INDEX
调用。但是,这种方法需要重建表,这会影响性能。如果将数据加载到一个新的 MySQL 实例中,请考虑使用
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
语法禁用重做日志记录。禁用重做日志记录有助于通过避免重做日志写入来加快数据加载速度。有关更多信息,请参阅禁用重做日志记录。警告此功能仅用于将数据加载到新的 MySQL 实例中。 不要在生产系统上禁用重做日志记录。 允许在禁用重做日志记录时关闭和重新启动服务器,但如果在禁用重做日志记录时意外停止服务器,可能会导致数据丢失和实例损坏。
使用 MySQL Shell 导入数据。MySQL Shell 的并行表导入实用程序
util.importTable()
为大型数据文件提供快速数据导入到 MySQL 关系表的功能。MySQL Shell 的转储加载实用程序util.loadDump()
也提供并行加载功能。请参阅MySQL Shell 实用程序。