2011-06-27 13 views
1

PhpMyAdminを使用してデータベースと2つのテーブルcustomer_fullとcustomer_changeを作成しました。私は正常に2つのテキストファイルから2つのテーブルを作成し、customer_fullは12902の行を含み、customer_changeは12947の行を持ち、各行は各顧客を識別するCUSTOMER_IDフィールドを持っています。 customer_changeテーブルには、customer_fullが持たないいくつかの新しいメンバーがあり、それらを取得したいと思います。PhpMyAdminを使用して簡単なSQLクエリを実行する際に問題が発生しました

タスク今私がする必要があるが、非常に一般的ですが、私は唯一のcustomer_changeテーブルに存在するがcustomer_fullテーブルに存在しない行を取得する必要があるので、私は次のクエリを書き、実行:

SELECT * FROM customer_change 
LEFT JOIN customer_full ON customer_change.CUSTOMER_ID = customer_full.ID 
WHERE customer_full.ID IS NULL 

私はPhpMyAdminでクエリを送信した後、常に "http://localhost/phpmyadmin/import.phpの待機"に留まり、最終的にはタイムアウトエラーになります。私は

SELECT * FROM customer_change,customer_full 

のようないくつかの単純なクエリを実行する場合 しかし、これは動作し、単に2つのテーブルのすべてのレコードを結合して、結果を返します。だから、私の専門家がデバッグを手伝ってくれるのかと疑問に思っています。私の質問には問題がありますか、PhpMyAdminの設定をもっと調べるべきでしょうか?あるいは、私の前の質問が失敗した他の理由があるかもしれませんか?

MySqlの自己学習を始めたばかりなので、これが簡単なのであればご容赦ください。すべての助けを前もって感謝します。

答えて

2

この:

SELECT * FROM customer_change,customer_full 

は、それがcustomer_fullのすべての行に対してテーブルcustomer_change内のすべての行を結合クロス結合です。したがって、12,902 x 12,947 = 167,042,194行を返します。なぜあなたがこれを望むのか分かりません。

左はあなたが書いた参加正しいよう:

それは迅速に実行するためには、インデックス
がありません
SELECT * FROM customer_change 
LEFT JOIN customer_full ON customer_change.CUSTOMER_ID = customer_full.ID 
WHERE customer_full.ID IS NULL 

、あなたはcustomer_full.IDcustomer_change.CUSTOMER_IDのインデックスとインデックスを配置する必要があります。
これを実行したらすぐに実行する必要があります。

破損テーブル
あなたのテーブルが壊れている可能性もあります。特にMyISAMを使用している場合。
http://dev.mysql.com/doc/refman/5.0/en/corrupted-myisam-tables.html
またはこのリンク:インデックス部分のhttp://www.thegeekstuff.com/2008/09/how-to-repair-corrupted-mysql-tables-using-myisamchk/

+0

おかげ
は、このリンクで概説した手順を試して、実行します。実際にはLEFT_JOINからNOT INへの切り替えがさらに高速になるようです。 – Kevin

+0

@Robert: 'xからyを選んでください。xは(選択...)ではありません。'は95%のはるかに遅いです。 'not in'リストが小さいので、テーブル間の不一致がほとんどないので、あなたのケースではより速いだけです。 'not in'リストが大きくなると、' left join ... xがヌルです.'よりもずっと遅くなります – Johan

関連する問題