### 8.5.5 InnoDB 表的批量数据加载

[](<>)

这些性能提示补充了快速插入的一般准则[第 8.2.5.1 节，“优化 INSERT 语句”](insert-optimization.html).

-   导入数据时`InnoDB`, 关闭自动提交模式，因为它为每次插入执行日志刷新到磁盘。要在导入操作期间禁用自动提交，请将其包围[`SET 自动提交`](commit.html)和[`犯罪`](commit.html)声明：

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

    这[**mysql转储**](mysqldump.html)选项[`- 选择`](mysqldump.html#option_mysqldump_opt)创建可以快速导入的转储文件`InnoDB`表，即使没有用[`SET 自动提交`](commit.html)和[`犯罪`](commit.html)陈述。

-   如果你有`独特`对辅助键的约束，您可以通过在导入会话期间暂时关闭唯一性检查来加快表导入：

    ```
    SET unique_checks=0;
    ... SQL import statements ...
    SET unique_checks=1;
    ```

    对于大表，这可以节省大量磁盘 I/O，因为`InnoDB`可以使用其更改缓冲区批量写入二级索引记录。确保数据不包含重复键。

-   如果你有`外键`约束，您可以通过在导入会话期间关闭外键检查来加快表导入：

    ```
    SET foreign_key_checks=0;
    ... SQL import statements ...
    SET foreign_key_checks=1;
    ```

    对于大表，这可以节省大量的磁盘 I/O。

-   使用多行[`插入`](insert.html)如果您需要插入许多行，可以使用以下语法来减少客户端和服务器之间的通信开销：

    ```
    INSERT INTO yourtable VALUES (1,2), (5,5), ...;
    ```

    此技巧适用于插入任何表，而不仅仅是`InnoDB`表。

-   在对具有自动增量列的表进行批量插入时，设置[`innodb_autoinc_lock_mode`](innodb-parameters.html#sysvar_innodb_autoinc_lock_mode)到 2（交错）而不是 1（连续）。看[第 15.6.1.6 节，“自动\_InnoDB 中的增量处理”](innodb-auto-increment-handling.html)详情。

-   执行批量插入时，插入行更快`首要的关键`命令。`InnoDB`表使用[聚集索引](glossary.html#glos_clustered_index)，这使得按顺序使用数据相对较快`首要的关键`.在中执行批量插入`首要的关键`顺序对于不完全适合缓冲池的表尤其重要。

-   为了在将数据加载到`InnoDB` `全文`索引，请遵循这组步骤：

    1.  定义列`FTS_DOC_ID`在表创建时，类型`BIGINT 无符号非空`, 有一个名为的唯一索引`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.  创建`全文`数据加载后的索引。

    笔记

    添加时`FTS_DOC_ID`在创建表时列，确保`FTS_DOC_ID`列更新时`全文`索引列被更新，因为`FTS_DOC_ID`必须随着每个单调增加[`插入`](insert.html)要么[`更新`](update.html).如果您选择不添加`FTS_DOC_ID`在创建表时并拥有`InnoDB`为您管理 DOC ID，`InnoDB`添加了`FTS_DOC_ID`作为与下一个隐藏的列[`创建全文索引`](create-index.html)称呼。但是，这种方法需要重新构建表，这会影响性能。

-   如果将数据加载到*新的*MySQL 实例，考虑使用禁用重做日志记录[`ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG`](alter-instance.html)句法。禁用重做日志有助于通过避免重做日志写入来加速数据加载。有关详细信息，请参阅[禁用重做日志](innodb-redo-log.html#innodb-disable-redo-logging).

    警告

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

-   使用 MySQL Shell 导入数据。MySQL Shell 的并行表导入实用程序`util.importTable()`为大型数据文件提供到 MySQL 关系表的快速数据导入。MySQL Shell 的转储加载实用程序`util.loadDump()`还提供并行加载功能。看[MySQL 外壳实用程序](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities.html).
