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

时间:2015-10-17 21:01:00

标签: php mysql

我有一个人们发布图片的网站,人们可以喜欢这样的帖子,就像桌子上有一排,如果有人删除了一个帖子,我想删除该特定帖子的每一行。这个数字可能非常大,如15,000或更多,删除帖子的用户等待的时间可能很长。

要删除帖子,我希望在后台删除另一个脚本中的15,000行。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:9)

很多选择。这是一个建筑/工程决策而不是其他任何事情。我会抛出一个想法。

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

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

另一方面,删除15,000行真的需要很长时间吗?

DELETE FROM `table` WHERE post_id = x

似乎会快速执行,但没有看到数据结构,很难说肯定。

答案 1 :(得分:4)

软删除+ cronjob推荐:

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

但是,如前所述,已经在每个表中添加了deleted这样的列,并且当必须删除记录时,您将此列中的值设置为true。

在此之后你可以开发一个将被触发的cronjob。例如。在午夜的每日基地。

cronjob通常会在shell上执行,而且浏览器的时间不会很短。

在您的情况下:删除图片后不要删除所有数据:

当您处理几条记录时,当用户想要删除所有记录时,完全删除所有记录是合法的。

但是,在您的情况下,可能有数千条记录必须删除。因此,当您尝试在用户删除某个图像时删除所有这些内容时,肯定需要时间并可能以超时结束。通过ajax做这件事并不好,因为用户不想等到所有ajax请求都完成。

答案 2 :(得分:3)

使用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!";

答案 3 :(得分:2)

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