0

私は2つのテーブルを持っていますall_users:vip_users

all_usersテーブルにはシステム内のすべてのユーザーのリストがあり (あなたは言いませんか?)、現在、約 57,000 のレコードがあり、vip_usersテーブルには約 37,000 のレコードがあります。

両方のテーブルの主キーは自動インクリメントidフィールドです。all_usersテーブルは属性数の点で大きく(約20、そのうちの1つはemail)、vip_usersテーブルには(と一緒にidemail属性しかありません。

これを行うことで「非Vip」ユーザーを照会したかったのです( SOに関するこの質問の助けを借りて):

SELECT all_users.id, all_users.email
FROM all_users 
LEFT OUTER JOIN vip_users 
    ON (all_users.email=vip_users.email) 
WHERE vip_users.email IS NULL

そして今、ついに問題が発生しました-phpmyadminでこのクエリを実行しましたが、20分後でも完了に時間がかかりすぎたため、クエリを閉じてhttpdサービスを再起動する必要があり、サーバーの負荷が2を超え、サイト(ロードが遅すぎたため、役に立たなくなりました。だから、私の質問は - どうすればこのクエリを作成できますか? いくつかのスクリプトを作成して一晩実行しますか? phpmyadmin を使用しないでください (これが問題の原因でしょうか?)、または別の SQL クエリを使用する必要がありますか?

これについてのあなたの考えを助けてください。

4

3 に答える 3

3

両方のテーブルでフィールド email のインデックスを作成してみてください。これにより、クエリが高速化されます。

CREATE INDEX useremail ON all_users(email)

CREATE INDEX vipemail ON vip_users(email)
于 2012-05-22T16:43:22.993 に答える
0

書かれているように、探している結果が得られません。電子メールがユーザーの電子メールと一致し、NULL でもある vip_users 行を探しています。

vip_users にユーザーとは別の ID を持たせたい理由はありますか? vip_users id フィールドを users id フィールドの fk に変更すると、select は次のように変更されます。

SELECT all_users.id, all_users.email
FROM all_users 
LEFT OUTER JOIN vip_users 
    ON (all_users.id=vip_users.id) 
WHERE vip_users.email IS NULL;

このクエリに認識できるほどの時間がかかる理由はありません。37k レコードはそれほど大きなテーブルではありません....

于 2012-05-22T16:31:04.403 に答える
0

NOT INは よりも高速で、リソースの使用量が少ないと思いますLEFT OUTER JOIN

試してみませんか -

SELECT *
FROM all_users
WHERE id NOT IN (SELECT id 
                 FROM vip_users
                 WHERE email IS NULL);
于 2012-05-22T16:26:33.043 に答える