Sql Multiple Update Query更快

时间:2017-01-07 13:04:50

标签: php mysql pdo

我有一个像这样的查询。

UPDATE package
            SET DonePackageID = :NewDonePackageID ,UserId=:NewUserID
            where DonePackageID=:DonePackageID AND UserId=:UserID AND ConsumerID=:ConsumerID

我运行了这段代码但只是ConsumerID正在改变。 我写这样的代码

    for(i){
//Query dataBase
   " UPDATE package
            SET DonePackageID = :NewDonePackageID ,UserId=:NewUserID
            where DonePackageID=:DonePackageID AND UserId=:UserID AND ConsumerID=".ID[i]
    }

我有600.000数据,当我运行此代码时,我的MYSQL服务器运行大约2小时。 我怎样才能比查询我的问题更好?我怎样才能更快地运行此查询?

1 个答案:

答案 0 :(得分:2)

您不希望循环600,000行并进行大量更新。你想在一个声明中完成所有这些。类似的东西:

UPDATE package p JOIN
       t
       ON t.DonePackageID = p.DonePackageID and
          t.userId = p.userId
    SET p.DonePackageID = t.NewDonePackageID,
        p.UserId = t.NewUserID;

这假设t中的列正确(应该是显而易见的)。

这对于package(UserId, DonePackageId)上的索引最有效,即使这会降低查询速度。

更新600,000行(特别是对活动索引进行更新)仍然很慢。您可能希望批量进行更新。一个简单的方法是:

UPDATE package p JOIN
       t
       ON t.DonePackageID = p.DonePackageID and
          t.userId = p.userId
    SET p.DonePackageID = t.NewDonePackageID,
        p.UserId = t.NewUserID
    WHERE p.DonePackageID <> t.NewDonePackageID OR
          p.UserId <> t.NewUserID
    LIMIT 1000;

您可以运行此操作直到不再更新行。