7

我是 MySQL 新手,对它知之甚少。

我面临的问题如下所述:

以前我有以 MyISAM 作为其 MySQL 引擎的数据,过去在任何机器上导入大约需要 15 分钟。但是,当我将引擎更改为 InnoDB 时,几乎需要 90 分钟才能在任何机器上导入。请给我同样的建议。

4

2 回答 2

12

Innodb 表对于并发插入更快。请参阅Innodb 性能优化基础知识

为了获得最佳性能,您需要在文件中调整INNODB引擎。my.cnf

假设,如果您4GB RAM尝试将my.cnf文件配置为:

#Innodb
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 512M
innodb_log_file_size = 1G
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 30
innodb_file_per_table=1
innodb_file_format=barracuda
innodb_strict_mode=1
innodb_autoinc_lock_mode = 0

然后重启 MySQL 服务器。

于 2012-09-11T05:16:05.160 回答
2

@Omesh 有一些很棒的技巧,我认为这是我最近导入 3600 万行的 4.5GB 和 5.0GB SQL 成功的部分原因。我想在其他一些额外的提示有帮助的地方找到一个位置。

  1. 遵循@Omesh MySQL 配置建议。

  2. 接下来,查看您尝试导入的实际 SQL 文件。我们用来转储数据的工具在 INSERT语句之前添加了这些行:

    /*!40000 ALTER TABLE `table_name` DISABLE KEYS */;

    我所做的是取消注释该行。它在插入期间禁用对主键的检查,从而使其运行得更快。如果您没有该行,则可以手动添加它:

    ALTER TABLE `table_name` DISABLE KEYS;

    如果这是一个正在使用的实时数据库,请谨慎使用。

  3. 在语句之后INSERT,该工具还立即添加了这一行。删除注释以重新启用主键:

    /*!40000 ALTER TABLE `table_name` ENABLE KEYS */;

    同样,它应该如下所示:

    ALTER TABLE `table_name` ENABLE KEYS;

  4. 在实际运行插入语句之前,关闭autocommit, unique_checks, 并foreign_key_checks使用查询:

    set autocommit=0; set unique_checks=0; set foreign_key_checks=0;

  5. 现在运行您的导入:

    source /path/to/your/file.sql

  6. 导入成功完成后,您需要提交然后重新启用unique_checksforeign_key_checks

    commit; set unique_checks=1; set foreign_key_checks=1;

您可能需要考虑进行导入的其他一些注意事项:

  • 如果您使用的是虚拟机,请增加 VM 的可用资源(RAM、CPU 核心数),直到导入完成

  • 如果您使用的是物理机器,则可能从另一台机器借一些 RAM 足够长的时间来完成导入

  • 如果可能,请使用 2 个不同的磁盘:1 个专用于读取(SQL 文件的源)和一个专用于写入(DB 或 VM 所在的位置)

希望这对其他人有帮助!

于 2016-03-01T16:46:19.333 回答