有效修剪MySQL重复记录(PHP)

时间:2012-01-08 20:33:28

标签: php mysql optimization

我想修剪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。

1 个答案:

答案 0 :(得分:0)

无论你调整什么来加速它,删除这样的很多行都会很慢。不要一次删除所有行,而是通过在查询中包含LIMIT子句来批量执行它们。此外,请确保从cron作业而不是从您网站上的链接运行脚本,如果您想要非常安全,请增加或禁用PHP执行时间限制,以便在删除阶段不要点击它