2009-09-17 6 views
1

Note: les rédacteurs en chef: s'il vous plaît modifier le titre si avoir un meilleur :)supprimer des enregistrements de la table en utilisant une autre table?

ma question est:

J'ai deux tables dans ma base de données

 ----------- 
    | table1 | 
    |----------| 
    | id  | 
    |text  | 
    =========== 


    ----------- 
    | table2 | 
    |----------| 
    | id  | 
    |text  | 
    =========== 

table1 est 600.000 dossiers

table2 est 5.000.000 enregistrements !! :)

quelle est la meilleure façon de supprimer tous les enregistrements dans table2 à ne sont pas dans le tableau 1

I principale de la façon la plus rapide parce que -le je ne veux pas attendre 4 heures pour terminer le processus

avez-vous quelque chose de mieux que le code suivant:

<?PHP 
    $sql = "select text from table2"; 
    $result = mysql_query($sql) or die(mysql_error()); 
    while($row = mysql_fetch_array($result)){ 
     $text = $row["text"]; 
     $sql2 = "select id from table1 where text = '$text'"; 
     $query2 = mysql_query($sql2) or die(mysql_error()); 
     $result2 = mysql_num_rows($query2); 
     if($result2==0){ 
      $sql3 = "delete from table2 where text = '$text'"; 
      $query3 = mysql_query($sql3) or die(mysql_error()); 
     } 
    } 
?> 

Merci

Répondre

5

Qu'en est-il de laisser le RDBM le gérer?

par exemple

DELETE FROM table2 WHERE text NOT IN (select distinct text from table1) 

Vive

PS: faire une sauvegarde avant le test ...

+0

La suppression d'une telle quantité d'enregistrements peut-elle déborder le journal des transactions? – mjv

+0

dépendent s'il fait une transaction mais oui si 'oui' l'enregistrement de la transaction augmenterait considérablement – RageZ

1

Pourquoi ne pas ajouter une nouvelle colonne à Table2 est un octet, puis juste faire une mise à jour mettre cet octet à true ou 'Y' si cette ligne est dans les deux tables.

Ensuite, supprimez simplement les lignes qui n'ont pas ce jeu de colonnes.

Cela semblerait être l'OMI le plus simple et le plus rapide.

3

Votre solution est en train de faire quelque chose comme 2 requêtes par ligne dans la table table2 - ce qui signifie que deux millions de requêtes - qui sera plutôt lent ^^

En utilisant MySQL, vous pourriez être en mesure de supprimer tous les ceci en une seule requête: l'instruction DELETE peut être utilisée pour supprimer des données de plusieurs tables. La première chose est d'écrire l'instruction select qui correspondra aux données que vous voulez supprimer (c'est une meilleure façon de tester que d'essayer une suppression sans savoir si elle traitera vraiment les bonnes données); quelque chose comme cela pourrait faire:

select table2.* 
from table2 
    left join table1 on table1.text = table2.text 
where table1.id is NULL 

Cela devrait vous obtenir toutes les données qui est en table2, mais pas dans le tableau 1.

Une fois que vous êtes sûr que cette requête obtient les bonnes données, vous pouvez le transformer à une requête de suppression:

delete table2 
from table2 
    left join table1 on table1.text = table2.text 
where table1.id is NULL 

Cela pourrait faire - bien sûr, il serait préférable de premier test sur un test base de données, et pas sur votre production!

Sinon, quelque chose avec un IN et une sous-requête pourrait faire; un peu comme

delete 
from table2 
where text not in (select text from table1) 

Je ne sais pas ce qui sera plus rapide, mais, compte tenu de la quantité de données que vous avez - encore de toute façon, je ne ferais pas le genre de boucle PHP que vous proposiez, mais il irait avec un SQL requête qui peut tout supprimer par lui-même: éviter tous ces appels de PHP à la DB rendra certainement les choses plus vite!

1

Essayez ceci:

DELETE table2 Where id NOT IN (SELECT id from table1) 

Note: Faites une sauvegarde avant d'exécuter la requête

0

Créer table3 comme table2 insert dans table3 (SELECT table2.ID, TABle2.TEXT de table1 rejoindre table2 sur. ..) goutte table2 alter table3 nouveau nom table2

Implique un peu de gestion (il est donc une option valable si vous pouvez facilement déposer/modifier les tables), mais au moins la partie DML wi Je surperformerai toute autre option, me semble-t-il.

Questions connexes