MYSQL:SELECT或者DELETE,在性能方面比较好避免重复

Posted

技术标签:

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

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

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

进一步更新

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

【问题讨论】:

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

以上是关于MYSQL:SELECT或者DELETE,在性能方面比较好避免重复的主要内容,如果未能解决你的问题,请参考以下文章

MySQL慢查询分析

MySQL性能测试之select&updateFunTester框架#yyds干货盘点#

MySql之Explain

DELETE with NOT IN (SELECT ...) 的性能

请教高手oracle 创建了索引后在使用SELECT,UPDATE,DELETE和INSERT语句时性能影响上有啥不同?

mysql和sqlserver的语句一样吗select 、delete 。。。