【问题标题】:How to optimize MySQL to insert millions row?如何优化 MySQL 以插入数百万行?
【发布时间】:2012-08-10 23:53:11
【问题描述】:

我需要将数百万行插入 MySQL 数据库(InnoDB 引擎)。当桌子很大时,我有时间问题。几乎所有时间都花在插入查询上。也许有人知道如何优化它?

【问题讨论】:

  • 那您的查询是什么?
  • 在您插入数据时,还有其他对表执行的操作吗?
  • 只是为了确定:您想知道如何设置 MySQL 来处理大量插入(或一般写入)或如何设置它来处理大量存储的数据?
  • 还有一个问题:您需要大量数据(每个事务有很多插入)还是许多小事务的性能?
  • 一项包含数百万插入查询的大事务。

标签: mysql optimization insert


【解决方案1】:

将大量数据导入 InnoDB:

  1. 在 MySQL 配置中设置

    • innodb_doublewrite = 0
    • innodb_buffer_pool_size = 50%+ 系统内存
    • innodb_log_file_size = 512M
    • log-bin = 0
    • innodb_support_xa = 0
    • innodb_flush_log_at_trx_commit = 0
  2. 事务开始后立即添加:

    SET FOREIGN_KEY_CHECKS = 0;

    SET UNIQUE_CHECKS = 0;

    设置自动提交 = 0;

  3. 在交易结束前设置:

    SET UNIQUE_CHECKS = 1;

    SET FOREIGN_KEY_CHECKS = 1;

【讨论】:

  • 这些优化让我从每 10 分钟处理 10,000 条记录到 500,000 条记录,令人印象深刻。
  • 如果设置为1,还要设置sync_binlog = 00是默认值)
  • @zogby 和 log_bin = 0 binlog 被完全禁用,所以 sync_binlog = 0 没有区别。
  • 无法再禁用选项innodb_support_xa。来自手册:Disabling innodb_support_xa is no longer permitted as it makes replication unsafe and prevents performance gains associated with binary log group commit.
【解决方案2】:

如果您谈论大量INSERT 语句,请查看称为事务的东西。我很确定大多数(如果不是全部)执行 SQL 的语言都支持事务。他们将加快涉及写入数据库的任何事情。另一个好处是,如果出现问题,您可以回滚更改。

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2017-01-11
    • 2014-12-27
    • 2020-12-31
    相关资源
    最近更新 更多