我有一个数组(在PHP中),它有一个UID列表,我想更新一个已经包含那些UID的行的MySQL表,其中索引是UID在数组中的位置。
所以我的UID数组可能是:
[1123,4542,3456,2212,2346,7778,577885,44322]
我想将表更新为以下效果:
POS | UID
----------
1 |1123
2 |4542
3 |3456
etc
----------
数据集(数组)可能非常大(1000+),我正在更新的表还包含其他UID,这些UID是我不想触摸的其他数据集的一部分(但将具有唯一的UID)。
我显然可以通过循环和更新语句的大量加载来做到这一点,但是想知道是否有更有效的方法可以使用单个或仅仅几个语句来执行此操作。
我已经做了很多搜索,只能找到与设定/固定数量的值相关的答案或基于其他数据库表进行更新,但我的数组的长度会有所不同,具体取决于要更新的数据集。 / p>
答案 0 :(得分:0)
如果使用准备好的声明的更新速度不够快,您可以尝试预先加载"将数据放入带有批量插入的临时表中。以下是PDO的示例代码:
// $uids = [1123,4542,3456,2212,2346,7778,577885,44322,...]
$values = [];
foreach ($uids as $key => $uid) {
$pos = $key+1;
$values[] = "($uid,$pos)";
}
$values = implode(',', $values);
$pdo->exec("
drop temporary table if exists tmpdata;
create temporary table tmpdata (uid int, pos smallint) engine=memory;
insert into tmpdata(uid, pos) values $values;
update test d
join tmpdata t using(uid)
set d.pos = t.pos;
");
我用10K UID测试了这个 - 它在我的机器上运行了50ms。
注意:您可能需要验证/清理数据以防止SQL注入。
如果您使用复制,也请阅读this。
答案 1 :(得分:0)
道歉所有,一直忘记更新问题 - 我已经选择了简单的选项,只需循环访问对象并使用新查询更新每个对象。
我没有任何具体时间,但这样做似乎没有任何明显的性能损害,因此我对这种方法非常满意
感谢大家的帮助