代码之家  ›  专栏  ›  技术社区  ›  Tatu Ulmanen

从大表中删除重复项

  •  12
  • Tatu Ulmanen  · 技术社区  · 15 年前

    我有一个很大的表,有19000000条记录,我有重复行的问题。有很多类似的问题,即使在这里,但似乎没有一个给我一个满意的答案。需要考虑的几点:

    • 行唯一性由两列决定, location_id datetime
    • 我想尽量缩短执行时间(<1小时)。
    • 复制表不是很可行,因为表的大小是几GB。
    • 不用担心关系。

    如前所述, 位置标识 只能有一个不同的 小精灵 ,我要删除所有重复的实例。它们中的哪一个幸存并不重要,因为数据是相同的。

    有什么想法吗?

    5 回复  |  直到 7 年前
        1
  •  16
  •   shadyabhi    12 年前

    我认为您可以使用此查询从表中删除重复记录

    ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime)
    

    在做这件事之前,先用一些样本数据进行测试..然后再试试这个….

    注意:在版本5.5中,它在myisam上工作,但在innodb上不工作。

        2
  •  1
  •   Patrick    15 年前
    SELECT *, COUNT(*) AS Count
    FROM table
    GROUP BY location_id, datetime
    HAVING Count > 2
    
        3
  •  0
  •   remi bourgarel    15 年前
    UPDATE table SET datetime  = null 
    WHERE location_id IN (
    SELECT location_id 
    FROM table as tableBis
    WHERE tableBis.location_id = table.location_id
    AND table.datetime > tableBis.datetime)
    
    SELECT * INTO tableCopyWithNoDuplicate FROM table WHERE datetime is not null
    
    DROp TABLE table 
    
    RENAME tableCopyWithNoDuplicate to table
    

    所以你保持较低的约会时间。我不确定性能,这取决于你的表列,你的服务器等等…

        4
  •  0
  •   Keith    11 年前

    这个查询对每种情况都非常有效:tested for engine:myisam for 200万行。

    alter ignore table\u name add unique(位置id,日期时间)

        5
  •  0
  •   محسن عباسی    7 年前

    可以使用以下步骤删除重复项: 1-将以下查询的结果导出到TXT文件中:

    select dup_col from table1 group by dup_col having count(dup_col) > 1
    

    2-将其添加到上述txt文件的第一个中,并运行最终查询:

    delete from table1 where dup_col in (.....)
    

    请注意,“…”是在第一步中创建的TXT文件的内容。