有没有一种在不降低网站速度的情况下删除大量记录的好方法?
我需要从没有索引和主键的 MySQL 表中删除数百万条记录。我在网上阅读了 SO 和各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复该过程直到完成。我也(使用 PDO)在所有循环完成后运行提交。
上周运行良好,但每次我运行脚本时,数据库都会变慢,并且我们收到很多关于网站运行缓慢等的投诉。这是在 Miva Merchant 购物篮表上,这并不重要。
我几乎完成了修剪桌子,所以我可以忍受它并完成。但一定有更好的办法……?
以下是相关代码:
$database->beginTransaction();
$selectLimit = 4900; // mysql will lock the entire table at 5000+.....
$loopLimit = 10;
$date = "1456272001"; // 2016-02-24
for( $i = 0; $i < $loopLimit; $i++ ) {
$startTime = time();
$oldBaskets = $database->prepare("DELETE FROM s01_Baskets WHERE CAST(lastupdate AS UNSIGNED) < '" . $date . "' LIMIT " . $selectLimit . "");
if ( $oldBaskets->execute() ) {
$deletes = $oldBaskets->rowCount();
$totalDeletes += $deletes;
$duration = time() - $startTime;
echo "\ndeleted '" . $deletes . "' entries";
echo "\n-- took '" . $duration . "' seconds";
}
sleep(2);
}
$database->commit();