Documentation Home
MySQL 8.0 参考手册  / 第8章优化  / 8.5 优化 InnoDB 表  /  8.5.5 InnoDB 表的批量数据加载

8.5.5 InnoDB 表的批量数据加载

这些性能提示补充了第 8.2.4.1 节“优化 INSERT 语句”中快速插入的一般准则。

  • 将数据导入InnoDB时,关闭自动提交模式,因为它会为每次插入执行日志刷新到磁盘。要在导入操作期间禁用自动提交,请用 SET autocommitand COMMIT语句将其括起来:

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

    mysqldump选项 --opt创建可以快速导入到表中的转储文件 ,即使不使用and 语句 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。有关详细信息,请参阅 第 14.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”

  • When performing bulk inserts, it is faster to insert rows in PRIMARY KEY order. InnoDB tables use a clustered index, which makes it relatively fast to use data in the order of the PRIMARY KEY. Performing bulk inserts in PRIMARY KEY order is particularly important for tables that do not fit entirely within the buffer pool.

  • For optimal performance when loading data into an InnoDB FULLTEXT index, follow this set of steps:

    1. Define a column FTS_DOC_ID at table creation time, of type BIGINT UNSIGNED NOT NULL, with a unique index named FTS_DOC_ID_INDEX. For example:

      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=latin1;
      CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on t1(FTS_DOC_ID);
    2. Load the data into the table.

    3. Create the FULLTEXT index after the data is loaded.

    Note

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