1

注: 編集者へ: より良いタイトルがあれば編集してください :)

私の質問は:

データベースに 2 つのテーブルがあります

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


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

table1 は 600,000 レコードです

table2 は 5,000,000 レコードです !!:)

table1 にない table2 のすべてのレコードを削除する最良の方法は何ですか?

ちなみに、私はプロセスを完了するために4時間待ちたくないので、最速の方法をメインにしています

次のコードよりも優れたものはありますか:

<?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());
        }
   }
?>

ありがとう

4

5 に答える 5

5

RDBMに処理させるのはどうですか?

例えば

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

乾杯

PS:テストする前にバックアップをとってください...

于 2009-09-17T04:51:39.447 に答える
3

あなたのソリューションは、table2テーブルの1行あたり2つのクエリのようなものを実行しています-これは、数百万のクエリを意味します-かなり遅くなります^^

MySQL を使用すると、1 回のクエリでこれらすべてを削除できる場合があります。このDELETE命令を使用して、複数のテーブルからデータを削除できます。

最初に、削除するデータに一致する選択命令を記述します(実際に適切なデータを処理できるかどうかを知らずに削除を試みるよりも、テストする方が良い方法です)。このようなことができるかもしれません:

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

これにより、table2 にあるが table1 にはないすべてのデータが取得されます。

このクエリが正しいデータを取得していることを確認したら、それを削除クエリに変換できます。

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

もちろん、最初にテスト データベースでテストするのが最善であり、実稼働データベースではテストしないでください。

それ以外の場合は、IN とサブクエリを使用して何かを行うことができます。少し似ている

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

ただし、持っているデータの量を考慮すると、どれがより高速になるかはわかりません-どちらにしても、提案した種類のPHPループは実行しませんが、すべてを単独で削除できるSQLクエリを使用します:すべてを回避するPHP から DB へのこれらの呼び出しは、確実に処理を高速化します。

于 2009-09-17T04:53:25.993 に答える
1

1バイトの新しい列をtable2に追加してから、そのバイトをtrueまたは「Y」に設定して更新を行うだけです。その行が両方のテーブルにある場合。

次に、この 1 つの列が設定されていない行を削除します。

これは、IMO の中で最も単純で最速のように思われます。

于 2009-09-17T04:52:15.093 に答える
1

これを試して:

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

注: クエリを実行する前にバックアップを作成してください

于 2009-09-17T05:04:05.177 に答える
0

table2 のように table3 を作成します table3 に挿入します (SELECT table2.ID、TABle2.TEXT from table1 join table2 on ...)

少し管理が必要ですが (テーブルを簡単に削除/変更できる場合にのみ有効なオプションです)、少なくとも DML 部分は他のどのオプションよりも優れていると思います。

于 2009-09-17T10:24:18.823 に答える