【问题标题】:MySQL Update a Complete Column data from Another Table with same Primary Key (30 Million Row)MySQL 使用相同的主键(3000 万行)从另一个表更新完整的列数据
【发布时间】:2013-04-29 22:41:06
【问题描述】:

我的 MySQL 数据库中有两个表:Final 和 Primary。 决赛桌:

UID (Primary Key), Surface (Varchar), BCD_Value (Int , Index), Env_Value (Int)

主表:

UID (Primary Key), BCD_Value (Int , Index)

每个表中有 3000 万行。主表具有正确的 BCD_Value。我必须在匹配 UID 时使用 Primary 中的值更新 Final Table 的 BCD_Value。

我在 MySQL 命令行中使用以下命令

update Primary pri, Final fin set fn.BCD_Value = pri.BCD_Value where fin.UID = pri.UID

但 36 小时后它什么也没做。

此外,我在 perl 中实现了一个代码,它一次为 5000 行创建更新语句(循环 3000 万/5000 次)。现在它正在工作,但我迫切需要固定它。

【问题讨论】:

    标签: mysql database sql-update large-data


    【解决方案1】:

    尝试转换成ANSI SQL-92语法

    UPDATE Final fin INNER JOIN `Primary` pri
           ON fin.UID = pri.UID
    SET fn.BCD_Value = pri.BCD_Value
    

    更新所有记录需要时间,因为它也会更新索引。

    先尝试删除Final.BCD_Value 上的索引,然后在更新完成后再次添加。

    【讨论】:

    • 感谢您的回复。我已经实现了你的代码,但时间几乎一样。
    • Final.BCD_Value 列上还有索引吗?
    • 是的。我必须保留它,因为我会用它来搜索表格。
    • 不,我的意思是现在。它会在您创建的每个 CRUD 中重新创建索引,因为该列已定义索引。
    • 执行 EXPLAIN SELECT 以了解查询是否会尽可能多,然后键入 show processlist 以了解 UPDATE 期间发生的情况。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2018-08-15
    • 2011-12-22
    • 1970-01-01
    • 2014-12-08
    • 2012-06-05
    相关资源
    最近更新 更多