【问题标题】:How to tune this query when updating 4 million records in MySQL?在 MySQL 中更新 400 万条记录时如何调整此查询?
【发布时间】:2013-05-14 23:47:12
【问题描述】:

我有这个查询将日期设置为遥远的未来。该表有 400 万条记录。查询非常简单。但是查询运行了将近 3 分钟。

UPDATE TABLE 
SET to_date = STR_TO_DATE('31-01-3000','%d-%m-%Y') 
WHERE to_date IS NULL;

此列没有索引。

如何调整这个查询或 MySQL 本身?非常感谢。

【问题讨论】:

  • 你反对加索引吗?

标签: mysql performance database-performance


【解决方案1】:

不涉及索引的最快解决方案(实际上是最快的解决方案 PERIOD)是使列默认为“31-01-3000”,这意味着您永远不必更新它。请注意,考虑到您是在如此大的表上运行它,初始 ALTER 可能需要几分钟时间。

ALTER TABLE `table_name`
CHANGE COLUMN `to_date` `to_date` DATE NOT NULL DEFAULT '3000-01-31';

【讨论】:

    【解决方案2】:

    使用单独的 SELECT 获取这些记录的索引,然后根据索引进行更新。并使用用户定义的变量提前存储计算。

    SET @newDate = STR_TO_DATE('31-01-3000','%d-%m-%Y')
    UPDATE yourTable 
    SET to_date = @newDate
    WHERE id IN (
      SELECT id FROM yourTable WHERE to_date IS NULL
    )
    

    此外,如果可能,请考虑围绕此要求进行编程。我自己的偏好是不将结束日期设置为 NULL,然后在查询结束日期时让查询足够聪明,以便明天用 NULL 代替。

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多