我正在使用以下查询从我的表中删除除一条记录之外的多条记录。它适用于小表,但当我尝试使用具有 >130000 条记录的表时它被卡住了。问题是,我什至没有收到错误。 phpMyAdmin 卡住了,查询(“正在加载...黄线”)基本上需要很长时间。
我的表结构
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 表上没有索引。但是我的其他三个表(person_job 和 person_image,book_who_wrote_it)包含来自 person 表(person_id)的外键
最佳答案
首先,您是否有关于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;
确保在截断 person
之前验证 tmp_person
! Truncate 不会记录每一行的删除,因此在大多数情况下它比 delete
快很多很多。
注意:
如果您在 person
中真的只有两列,那么您可以将第一个查询简化为:
create temporary table tmp_person as
select person_name, max(person_id) as max_person_id
from person;
关于mysql - 从一个非常大的表中删除多条记录(查询需要永远),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755642/