我想修剪MySQL数据库中的所有重复条目,只留下最早或最新的条目,具体取决于$ keep。我使用以下内容但速度很慢:
function pruneDuplicates($keep) {
if($keep == 1)
$order = "ASC";
else if ($keep == 0)
$order = "DESC";
//Go through and find the duplicate hashes. Grab the IDs that correspond to them then delete all but one ID
$query = "SELECT HEX(hash) FROM hashes GROUP BY hash HAVING count(hash) > 1";
$result = mysql_query($query) or die("ERROR: ".mysql_error());
while ($row = mysql_fetch_array($result)) {
$query = "SELECT id from hashes WHERE hash = UNHEX('$row[0]') ORDER BY id $order LIMIT 1";
$innerResult = mysql_query($query) or die("ERROR: ".mysql_error());
$innerRow = mysql_fetch_array($innerResult);
$query = "DELETE FROM hashes WHERE hash = UNHEX('$row[0]') AND id != $innerRow[0]";
echo $query."<br>";
mysql_query($query) or die("ERROR: ".mysql_error());
}
echo "Prune successful...";
}
echo $查询用于调试。这个脚本需要几分钟才能运行。它修剪了大约80,000条记录(我有超过100,000条记录,但预计会有1,000,000条记录)。我正在观看mysqladmin proc stat,我发现删除需要时间。
我的表格描述如下:
+-----------+------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| date | timestamp | NO | | CURRENT_TIMESTAMP | |
| hash | binary(16) | NO | MUL | NULL | |
hash是一个INDEX。
答案 0 :(得分:0)
无论你调整什么来加速它,删除这样的很多行都会很慢。不要一次删除所有行,而是通过在查询中包含LIMIT
子句来批量执行它们。此外,请确保从cron作业而不是从您网站上的链接运行脚本,如果您想要非常安全,请增加或禁用PHP执行时间限制,以便在删除阶段不要点击它