2

私は自分のデータベースから結果を取得しようとしています。次のクエリがあります。

  SELECT dubaifirstuser.mobile, dubaifirstuser.email, CONCAT( user.fname,  '', user.lname ) AS Name, bank_master.bank_name, bank_master.image, user.createdon
  FROM dubaifirstuser, user, bank_master
  WHERE dubaifirstuser.mobile = user.mobile
  AND bank_master.bank_id = user.bank_id
  AND user.bank_id IN ( 16, 18 )
  AND user.createdon <= '2012-05-31'
  AND dubaifirstuser.mobile NOT IN (SELECT mobile FROM renew_user
  );

しかし、条件を実行するには永遠に時間がかかります

 AND dubaifirstuser.mobile NOT IN (SELECT mobile FROM renew_user
  );

dubaifirstuserテーブルに何千ものレコードがあり、代わりにrenew_user試してみましたが、実行時間は永遠に続き、両方のテーブルにnullレコードはありません。より速く、またはより少ない実行時間でレコードをフェッチする方法を教えてください。NOT EXISTSNOT IN

4

2 に答える 2

1

not inMySQL では、パフォーマンスが向上する代わりにnot exists. クエリは次のとおりです。

dubaifirstuser.mobile NOT IN (SELECT mobile FROM renew_user)

その代わり:

not exists (select 1 from renew_user ru where ru.mobile = dubaifirstuser.mobile)

にインデックスを付けることで、パフォーマンスが向上しrenew_user(mobile)ます。renew_user最初のクエリでは、評価されるすべての行をスキャンします。何度も何度も。

ちなみに、これは古いバージョンの MySQL のパフォーマンスの問題です。5.6 リリース以降、修正されていると思います。

于 2013-05-25T13:01:50.620 に答える