【问题标题】:MySQL InnoDB Deleting Duplicate Rows - Time Out?MySQL InnoDB 删除重复行 - 超时?
【发布时间】:2017-02-14 14:44:48
【问题描述】:

我已经做了很多寻找,但我尝试过的每个解决方案似乎都不起作用。我已经删除了主键和自动增量。

我有一个大约有 260k 行的数据库。架构如下所示: [架构]http://imgur.com/X0oROkc

它是 Amazon RDS 上的托管 MySQL innodb 实例。当我尝试执行以下命令删除重复的行(推文、用户名)时,我收到 2006 错误 - mysql 服务器已消失。

create temporary table tmpTable (id int);

insert  tmpTable
    (id)
select  id
from    rawTweets yt
where   exists
    (
    select  *
    from    rawTweets yt2
    where   yt2.tweet = yt.tweet
            and yt2.username = yt.username
            and yt2.id > yt.id
    );

DELETE FROM rawTweets USING rawTweets, tmpTable WHERE rawTweets.id=tmpTable.id

任何帮助将不胜感激!

-马特

【问题讨论】:

  • IGNORE 是你的朋友 - 如果你使用 Mysql ALTER IGNORE TABLE db01 ADD UNIQUE KEY idx1 (@ 987654324@,username )
  • 大声笑 - 我不敢相信它是如此简单。花了三秒钟!
  • 所提出的解决方案非常慢,因为 (1) 缺乏有用的索引,以及 (2) 算法缓慢。

标签: mysql innodb amazon-rds


【解决方案1】:

另一种方法可能如下:

创建与您拥有的相同的表,但在推文和用户名上添加 unique index 并插入替换所有行。

CREATE TABLE unique_tweets LIKE tweets;
ALTER TABLE unique_tweets ADD UNIQUE INDEX `uniq_username_tweet` (`username`, `tweet`);
REPLACE INTO unique_tweets (SELECT * FROM tweets);

在此之后只需重命名表。

【讨论】:

    【解决方案2】:

    Bernd Buffen 在 cmets 中给出了正确答案:

    ALTER IGNORE TABLE db01 ADD UNIQUE KEY idx1 (tweet,username)

    【讨论】:

    • 额外优势:马上,未来的副本将被阻止插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多