InnoDB 表的批量数据加载
概述
加速innodb表的数据批量加载的方法
解决方案
-
将数据导入
InnoDB
时,关闭自动提交模式,因为它会为每次插入执行日志刷新到磁盘。要在导入操作期间禁用自动提交,请用SET autocommit
andCOMMIT
语句将其括起来:SET autocommit=0; ... SQL import statements ... COMMIT;
mysqldump选项
--opt
创建可以快速导入到表中的转储文件 ,即使不使用and 语句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(连续)。 -
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
加载数据后 创建索引。
-
-
如果将数据加载到新
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
的 MySQL 实例中,请考虑使用语法禁用重做日志记录 。禁用重做日志记录有助于通过避免重做日志写入来加快数据加载。有关详细信息,请参阅 禁用重做日志记录。警告此功能仅用于将数据加载到新的 MySQL 实例中。不要在生产系统上禁用重做日志记录。允许在禁用重做日志记录时关闭并重新启动服务器,但是在禁用重做日志记录时服务器意外停止可能会导致数据丢失和实例损坏。
微信赞赏

支付宝赞赏

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步