【问题标题】:Approximately time of updating 10 milions row in mysqlmysql更新1000万行的大约时间
【发布时间】:2021-11-14 20:15:31
【问题描述】:

我需要更新超过千万行的表(生产)。开头会增加3个新闻栏目col1, col2, col3。这 3 个新闻栏将具有基于其他栏 prev_col1, prev_col2, prev_col3 的默认值。旧列和新列是 var char 列,最大长度为 10,其中一些可能为空。我在问大概的时间是多少,因为我从来没有一次更新过这么多行。

我应该使用简单的更新:

UPDATE table_name SET col1=prev_col1, col2=prev_col2, col3=prev_col3;

或者还有什么其他有效的方式来更新大量的行?

【问题讨论】:

  • 您是否尝试执行更新新表并基于另一个表的列值?或者您有一些 CSV 或其他格式的数据并想要执行它?
  • 在同一张表的列上
  • 这取决于您使用的硬件

标签: mysql sql database


【解决方案1】:

您可以使用事务来“测试”运行您的查询。但请不要直接在生产环境中运行它,始终在克隆版本中运行,直到您 100% 确定自己在做什么。

START TRANSACTION;
  UPDATE table_name SET col1 = prev_col1, col2 = prev_col2, col3 = prev_col3;
ROLLBACK;

这将运行查询,但不会提交,而是回滚。将在您使用的控制台或 GUI 中告诉您错误和时间。

【讨论】:

    【解决方案2】:

    有效的更新方法是使用MySQL Join-Buffer-Size 更新大行。 例如

    SET join_buffer_size = 1024 * 1024 * 42;
    UPDATE table1 a JOIN table2 b 
    ON a.field1 = b.field1 
    SET 
    a.field2 = b.field2,
    a.field3 = b.field3,
    a.field4 = b.field4;
    
    mysql> SET GLOBAL join_buffer_size = 1024 * 1024 * 42;
    

    这可能会有所帮助:- update-10-million-rows-in-mysql-single-table-as-fast-as-possible

    【讨论】:

    • 奇怪的是,这如此受欢迎。我在问题中没有看到有两个表的迹象。我理解这个问题是指在同一个表中的列,所以设置join_buffer_size是无关紧要的。
    【解决方案3】:

    一般无法计算执行时间。这取决于您的服务器存储数据的方式(堆、树...)以及硬盘驱动器或固态驱动器的读/写速度。

    我在大学的教授曾经说过,您可以在 SQL-Server-Activity-Monitor 中找到这些信息。我们从未尝试过,但我很确定您可以找到一些如何使用它的教程。

    或者你只是尝试@Jelle 的方法。这是一个相当安全的方式。尽管如此,我还是建议在晚上或在服务器使用不那么激烈的时候这样做。

    另外一个信息——你不应该关心你的 sql 请求的性能——ms sql server 内置了相当不错的优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多