我有一个像这样的查询。
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小时。 我怎样才能比查询我的问题更好?我怎样才能更快地运行此查询?
答案 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;
您可以运行此操作直到不再更新行。