从非常大的 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)
我正在使用以下查询从我的 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)