Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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顺序使用数据变得相对快速。对于不完全适合缓冲池的表格来说,对于不完全适合缓冲池的表格,这一点尤其重要。

  • 为了在加载数据到InnoDBFULLTEXT索引时获得最佳性能,请遵循以下步骤:

    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列时,请确保在INSERTUPDATE时更新FTS_DOC_ID列,因为FTS_DOC_ID必须在每次插入或更新后增加。您可以选择在创建表时添加FTS_DOC_ID,或者让InnoDB为您管理它。在后一种情况下,在第一次创建FULLTEXT索引时,InnoDB会在隐藏列中添加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 工具