文档主页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  为 InnoDB 表进行批量数据加载

10.5.5 为 InnoDB 表进行批量数据加载

这些性能技巧是对 第 10.2.5.1 节,“优化 INSERT 语句” 中关于快速插入的一般指南的补充。

  • 在将数据导入到 InnoDB 时,请关闭自动提交模式,因为它会对每次插入执行日志刷新到磁盘的操作。要禁用导入操作期间的自动提交,请将导入操作用 SET autocommitCOMMIT 语句包围。

    SET autocommit=0;
    ... SQL import statements ...
    COMMIT;

    mysqldump 选项 --opt 会创建可以快速导入到 InnoDB 表中的转储文件,即使不用 SET autocommitCOMMIT 语句包围它们也是如此。

  • 如果您的辅助键上存在 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 索引中的最佳性能,请遵循以下步骤。

    1. 在创建表时定义一个类型为 BIGINT UNSIGNED NOT NULL 的列 FTS_DOC_ID,并使用名为 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);
    2. 将数据加载到表中。

    3. 在数据加载完成后创建 FULLTEXT 索引。

    注意

    在创建表时添加 FTS_DOC_ID 列时,请确保在更新 FULLTEXT 索引的列时更新 FTS_DOC_ID 列,因为 FTS_DOC_ID 必须随着每次 INSERTUPDATE 单调递增。如果您选择在创建表时不添加 FTS_DOC_ID,并让 InnoDB 为您管理 DOC ID,InnoDB 会在下次调用 CREATE FULLTEXT INDEX 时添加 FTS_DOC_ID 作为隐藏列。但是,这种方法需要重建表,这会影响性能。

  • 如果将数据加载到新的 MySQL 实例中,请考虑使用ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG语法禁用重做日志记录。禁用重做日志记录有助于通过避免重做日志写入来加快数据加载速度。有关更多信息,请参见禁用重做日志记录

    警告

    此功能仅用于将数据加载到新的 MySQL 实例中。不要在生产系统上禁用重做日志记录。在禁用重做日志记录时允许关闭和重新启动服务器,但如果在禁用重做日志记录时服务器意外停止,可能会导致数据丢失和实例损坏。

  • 使用 MySQL Shell 导入数据。MySQL Shell 的并行表导入实用程序util.importTable()为大型数据文件提供快速数据导入到 MySQL 关系表。MySQL Shell 的转储加载实用程序util.loadDump()也提供并行加载功能。参见MySQL Shell 实用程序