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性能测试之select&updateFunTester框架#yyds干货盘点#
DELETE with NOT IN (SELECT ...) 的性能
请教高手oracle 创建了索引后在使用SELECT,UPDATE,DELETE和INSERT语句时性能影响上有啥不同?