2015-01-03 82 views
0

我正在使用以下查詢來刪除除我的表之外的多個記錄。它適用於小型表格,但當我使用具有> 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_job & person_image,book_who_wrote_it)包含來自person表(person_id)的外鍵

回答

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; 

確保您截斷person之前驗證tmp_person!截斷不會記錄每行的刪除,所以在大多數情況下它比delete快得多。

注:

如果你真的只有在person兩列,那麼你就可以簡化第一查詢:

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

不,我不知道在人員表上有一個索引。但是我的其他三個表(person_job&person_image,book_who_wrote_it)包含person表(person_id)中的外鍵。 – salep

+0

@salep。 。 。該索引將幫助你的查詢很多。 –

+0

從OP看來,他想要'person_id'的最大值(我可能是錯的 - 或者也許沒關係?) –

0

試試這個

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