从非常大的 table 中删除多条记录(查询需要永远)

Deleting multiple records from a very big table (query takes forever)

我正在使用以下查询从我的 table 中删除除一条记录之外的多条记录。它适用于较小的 tables,但当我尝试使用具有 >130000 条记录的 table 时它卡住了。问题是,我什至没有收到错误。 phpMyAdmin 卡住了,查询(“正在加载...黄线”)基本上需要很长时间。

我的table结构

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;

更新:我没有关于人物 table 的索引。但是我的其他三个 tables (person_job & person_image, book_who_wrote_it) 包含来自人 table (person_id)[=13= 的外键]

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

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

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;

请务必在 截断 person 之前验证 tmp_person ! Truncate 不会记录每一行的删除,因此在大多数情况下它比 delete 快很多很多。

注意:

如果 person 中确实只有两列,则可以将第一个查询简化为:

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

试试这个

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