如何在后台使用PHP和MySQL删除数千行


How to delete thousands of rows with PHP and MySQL in background?

我有一个网站,人们张贴图片,人们可以喜欢的每一个帖子喜欢有一行在一个表中,如果有人删除一个帖子,我想删除每一行为该特定的帖子。这个数字可以非常大,比如15000或更多,等待删除帖子的用户的时间可能很长。

要删除帖子,有一个表单,我想在后台删除另一个脚本中的15,000行。我怎样才能做到呢?

选项很多。这更像是一个架构/工程决策。我会提出一个主意。

从软删除开始。不实际删除帖子(及其关系),而是将状态设置为已删除。在空闲时间设置一个CRON作业,以运行查询来获取状态为deleted的帖子,并永久删除当时的所有内容。

刚刚注意到@Berril在他的评论中也提出了同样的建议。

顺便说一句,删除15,000行真的需要那么长时间吗?

DELETE FROM `table` WHERE post_id = x

似乎执行得很快,但没有看到数据结构,很难说。

软删除+ cronjob推荐:

我不建议完全删除记录,除非你必须保护数据隐私,例如

但是,正如已经提到的,在每个表中添加一个列,如deleted,当必须删除一条记录时,将该列中的值设置为true。

之后,您可以开发一个将被触发的cronjob。例如,在每天的午夜。

cronjob通常在shell上执行,不会像浏览器那样超时。

在您的情况下:当图像被删除时,不要删除所有数据:

当你只处理一些记录时,当用户想要删除它们时,完全删除所有记录是合法的。

然而,在您的情况下,可能有数千条记录必须删除。所以,当你试图删除所有照片时当用户删除某个图像时,这肯定需要时间,可能会超时。通过ajax来做是不好的,因为用户不想等到所有的ajax请求都完成了。

使用Ajax。尝试下面的脚本请求另一个页面删除后台的行。

<script>
        var con=new XMLHttpRequest();
        con.onreadystatechange=function()
        {
            if(con.readyState==4 && con.status==200)
                div.innerHTML+=con.responseText+"</br>";
        }
        con.open("POST","db.php",true);
        con.send();
</script>

并在db.php中编写以下代码。我假设db.php在当前html文件所在的目录中:

$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$run = mysqli_query($conn,"[Your Query here]");
print "Your Post Deleted Successfully!";

如果你在fastcgi模式下运行PHP(通常是nginx),你可以使用fastcgi_finish_request()来完成用户的请求,同时仍然在后台做一些事情,比如慢慢删除许多不需要用户确认的记录。

  • fastcgi,nginx
  • fastcgi,apache