在不使用循环mysql php的情况下从大表中删除具有不同标识符的多个记录

时间:2017-02-13 08:43:42

标签: php mysql sql innodb sql-delete

我有一百万行表。我需要删除所有具有某个列的行,这些行等于15k长列表中的一个值。

现在我把它设置为:

$list = array(
"Item1",
...
"Item15000"
);

foreach ($list as $item){

$sql = "Delete from table where `item`='$item'";

if ($con->query($sql) === TRUE) {
            echo "$item removed from table <br>";
        } else {
            echo "Error removing $item from shop_meta: " . $con->error . "<br>";
        }

}

在目前的状态下,它需要花费很多时间才能完成,而且我必须为许多其他类似的表做这件事。

如何加快速度或优化查询?有没有办法一次性查询它们以更快地完成它?

2 个答案:

答案 0 :(得分:1)

将这些15k列表放入表中,然后加入其中

Delete t
from your_table t
join temp_table tt on t.item = tt.delete_value

答案 1 :(得分:1)

计划A:

DELETE FROM t WHERE item IN (...long list of ids...)

B计划:

计划A,但是要有1000个ID。这对其他用户和复制(如果相关)更友好。建议使用autocommit=ON运行。

More tips关于重大删除。