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

标签 mysql sql

我正在使用以下查询从我的表中删除除一条记录之外的多条记录。它适用于小表,但当我尝试使用具有 >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/

相关文章:

mysql - 如何修改这个查询?

mysql - SQL:多次重复结果行,并对行编号

php - 无法获取要显示的查询结果--php/mysqli

SQL 查询问题 : How to merge two lists

php - SQL - 组合查询

sql - 我如何在 Postgresql 中查询带有标点符号的单词?

mysql - 处理需要数据库 (MySQL) 密码的脚本的安全方法是什么?

mysql - 如何在 Joomla 1.5 中创建 SQL 事务?

python - 我如何在 sqlalchemy 中表达这个查询?

sql - 从数字中删除尾随零