从一个非常大的表中删除多个记录(查询需要永远)

时间:2015-01-03 13:59:34

标签: mysql sql

我使用以下查询删除多个记录,除了我的表中的一个记录。它适用于小型表格,但是当我使用具有> 130000条记录的表格进行尝试时它会卡住。问题是,我甚至没有得到错误。 phpMyAdmin只是卡住了,查询(“loading ...黄线”)基本上是永远的。

我的表结构

person_id (AI & PK)
person_name ( I want to delete multiple person_name records except one)

查询

DELETE t2
FROM `person` t1
INNER JOIN `person` t2
    ON t1.person_name = t2.person_name
    AND t1.person_id < t2.person_id;

更新:我在人员表上没有索引。但我的其他三个表(person_job&amp; person_image,book_who_wrote_it)包含来自人员表的外键(person_id)

2 个答案:

答案 0 :(得分:4)

首先,你有person(person_name, person_id)的索引吗?那将是开始的地方。

删除大量行会产生开销。通常,将结果放在另一个表中并重新插入它会更快:

create temporary table tmp_person as
    select p.*
    from person p join
         (select person_name, max(person_id) as max_person_id
          from person
         ) pp
         on p.person_id = pp.max_person_id;

truncate table person;

insert into person
    select * from tmp_person;

确保在截断tmp_person之前验证person !截断不记录每行的删除,因此在大多数情况下它比delete快得多。

注:

如果person中只有两列,那么您可以将第一个查询简化为:

create temporary table tmp_person as
    select person_name, max(person_id) as max_person_id
    from person;

答案 1 :(得分:0)

试试这个

       DELETE 
       FROM `person` t1
       where person_id not in
                  (select * from 
                      (select person_id from person group by person_name)x)