【问题标题】:MySQL insert/update records very slowMySQL插入/更新记录非常慢
【发布时间】:2014-02-27 19:27:41
【问题描述】:

我发现mysql更新记录很慢。

我有一个逻辑,如果记录存在,它将更新,否则它将插入。 但是源数据库的总记录有 14k 行,并且它只在几秒内成功插入每一行,因此,它非常慢,我怎样才能在 1 分钟内插入 14k 行? 顺便说一句,我正在使用 c#

foreach (row in rows)
    checkrecords(row); // if exist update, else create.      

问候, MH

【问题讨论】:

  • innodb 缓冲池设置为我的 cpu 内存的 70%,它仍然没有效果。
  • 我不确定如何在 C# 中执行,但在 php 中我通常会结合插入语句并一次性执行。好吧,检查行是否存在并决定更新或插入行确实需要时间。对表使用 innodb,使用 profiling 来查看代码的哪一部分花费的时间最多。
  • 也在这里写你的代码,我们无法读懂你的想法来找出你想要做什么。
  • 我假设您是在checkrecords() 方法中提交您的事务?我不是 innodb 方面的专家,但只有在你构建了所有查询之后才尝试提交,就像在这个例子中 stackoverflow.com/questions/4818929/… 一样。这篇文章也可能有用(关闭自动提交)dev.mysql.com/doc/refman/5.5/en/…

标签: c# mysql performance


【解决方案1】:

重组查询并确保索引设置正确。

将要更新的行加载到临时表中。然后插入/更新为:

insert into t(. . .)
    select . . .
    from temptable tt
    on duplicate key update col1 = values(col1), . . .;

确保将您检查记录是否存在的条件组合成一个唯一索引。因此,如果您正在寻找三列的组合,请确保您在 t(col1, col2, col3) 上有一个唯一索引。

【讨论】:

    【解决方案2】:

    尝试设置值:

    innodb_flush_log_at_trx_commit=2
    innodb_flush_method=O_DIRECT (for non-windows machine)
    innodb_buffer_pool_size=25GB (currently it is close to 21GB)
    innodb_doublewrite=0
    innodb_support_xa=0
    innodb_thread_concurrency=0...1000 (try different values, beginning with 200)
    

    参考资料:

    MySQL docs 用于不同变量的描述。

    MySQL Server Setting Tuning

    MySQL Performance Optimization basics

    希望对你有帮助...

    请参考Why is MySQL InnoDB insert so slow?

    Source

    【讨论】:

      【解决方案3】:

      如果存在可能是问题的根源。 确保您在检查记录是否存在时使用唯一索引。

      【讨论】:

      • 嗨,谢谢,我有一个检查记录是否存在的功能。但问题是 14k 条记录仅在几个小时内创建了 7xx 条记录。
      猜你喜欢
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2020-07-19
      相关资源
      最近更新 更多