Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Bulk Data Loading for InnoDB Tables

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. 在表创建时定义一个 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);
    2. 将数据加载到表中。

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

    Note

    在表创建时添加 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。禁用重做日志记录可以加速数据加载,因为它避免了重做日志写入。有关更多信息,请参阅 禁用重做日志记录

    Warning

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

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