【问题标题】:MYSQL: SELECT or DELETE, which is better in terms of performance to avoid duplicationMYSQL:SELECT或者DELETE,在性能方面比较好避免重复
【发布时间】:2017-09-18 08:20:54
【问题描述】:

我有一张包含数百万条记录的表。我必须确保记录是唯一的。我想知道SELECT.. where 更好还是DELETE..where 更好?

问题更新:我只想保留唯一记录。

进一步更新

我正在运行线程,并且由于某些未知的原因,尽管检查了它们,但它们仍在 tabke 中插入 dups……很可能是由于同时运行 SELECT。那么询问是否检查记录是否存在比简单地删除匹配记录的行更昂贵?

【问题讨论】:

  • 问题含糊不清。您只想显示唯一记录还是仅存储唯一记录?
  • 或者你只是想要一个是/否关于它们是否都是独一无二的?所有可能的问题都有答案;我不想开始回答错误的问题。
  • @RickJames 我正在运行线程,并且由于一些未知的原因,尽管检查了它们,但它们仍在 tabke 中插入 dups……很可能是由于同时运行 SELECT。因此,询问是否检查记录存在是否比简单地删除匹配记录的行更昂贵?
  • 如果不在事务中,检查存在将不起作用。查看INSERT ... ON DUPLICATE KEY UPDATE ...
  • @RickJames 但我不必更新。

标签: mysql query-optimization


【解决方案1】:

使用INSERT IGNORE 避免意外插入同一条记录两次时出现重复键的错误。

注意:这只检查任何 UNIQUE 键(包括 `PRIMARY KEY,如果指定)。

但是...这表明您_没有UNIQUE 密钥来防止重复!

因此,您的下一个问题将是如何在已有重复项时添加UNIQUE 键。正确。

尝试发现重复项并删除它们既复杂又乏味,但可能更快。

这很简单:

CREATE TABLE new LIKE real;
ALTER TABLE new ADD UNIQUE ... -- some UNIQUE KEY to avoid duplicates
# stop writes to `real`  -- application-specific
INSERT IGNORE INTO new SELECT * FROM real;
RENAME TABLE real TO old,
             new TO real;
# allow writes again.
DROP TABLE old;

【讨论】:

  • 我有ID字段,即AUTO INCREMENT,重复字段是URL字段。
猜你喜欢
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多