【问题标题】:Delete multiple records with different identifiers from a large table without using loop mysql php从大表中删除具有不同标识符的多条记录而不使用循环mysql php
【发布时间】:2017-02-13 08:43:41
【问题描述】:

我有一百万行表。我需要从 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>";
        }

}

在目前的状态下,它需要很多小时才能完成,而且我也必须为许多其他类似的表格这样做。

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

【问题讨论】:

    标签: php mysql sql innodb sql-delete


    【解决方案1】:

    将这 15k 列表放在一个表中,然后加入它

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

    【讨论】:

    • 临时表中是否应该只有一列delete_value
    • 是的,它不需要更多。如果您已经在数据库中拥有这些值,那么您可以加入数据库中的任何位置
    • 啊,这太完美了,事实上,我已经有一张表格,上面列出了我需要过滤掉的项目!非常感谢楼主!
    【解决方案2】:

    A 计划:

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

    B计划:

    执行计划 A,但以 1000 个 id 为一组。这将对其他用户和复制(如果相关)更友好。建议使用autocommit=ON 运行。

    More tips 大删除。

    【讨论】:

      猜你喜欢
      • 2023-02-25
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多