0

したがって、この不浄なクエリがあり、実行に約 2 分かかるため、クリーンアップする必要があります。テーブル構造を変更することはできませんが、ループなどでサブクエリに分割することはできます。C++ と MySQL を使用しています。

基本的にタグが選択され、そのタグと結合しているユーザーをクエリで選択する必要があります。

これがクエリです。123 は長さ >= 1 の CSV タグ ID リストであり、josh@test.com は長さ >= 0 の無視する電子メールの CSV 電子メール リストです。アドバイスをいただければ幸いです。

SELECT user_id,user_primaryemail,USER_EMAIL_IS_VALID
FROM users
WHERE ( ( user_id IN ( SELECT union_target_id
                       FROM systemtag_union
                       WHERE union_systemtag_id IN ( '123' )
                         && union_type = 'User'
                       GROUP BY union_target_id
                       HAVING COUNT(DISTINCT union_systemtag_id) = 0) ) )
  && user_primaryemail NOT IN ( 'josh@test.com' )
  && USER_EMAIL_IS_VALID != 'No'
GROUP BY user_primaryemail

大まかなテーブル構造:

users
-----
user_id
user_primaryemail
user_email_is_valid

systemtags
-----
systemtag_id

systemtag_union
-----
union_systemtag_id (corresponds to systemtags.systemtag_id)
union_target_id (corresponds, in this case, to users.user_id)
union_type (the type of the union, irrelevant in this case)

編集: CSV としての EXPLAIN の結果は次のとおりです。

"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
1,"PRIMARY","users","ALL","user_email","","","",9104,"Using where; Using temporary; Using filesort"
2,"DEPENDENT SUBQUERY","systemtag_union","index","union_systemtag_id,union_type","union_target_id","4","",8,"Using where"
4

2 に答える 2

2

実際の回答とは対照的に、より詳細な質問の明確化...あなたの内部クエリはクエリを実行しているようです(ここで言い換え)

リストされたタグを 1 つ以上持っているが、個別のタグの数 = 0 である SystemTag_Union テーブルにある任意のユーザー ID。

これはばかげているように聞こえます...これらのタグのいずれかを持っているものを教えてください、しかしタグの数 = 0...それはそれです...資格を得るためには、WHERE句を満たす必要があります.

このクエリの最終的な意図を明確にできますか? 対応する特定のタグが関連付けられている (または関連付けられていない) ユーザーを探していますか?

私は実際にクエリを次のようなdistinctを使用するように変更します

SELECT DISTINCT 
      U.user_id,
      U.user_primaryemail,
      U.USER_EMAIL_IS_VALID
   FROM 
      users U
         JOIN systemtag_union STU
            ON U.User_ID = STU.union_target_id
           AND STU.Union_Type = 'User'
           AND STU.union_systemtag_id IN ( '123' )
   WHERE 
          U.USER_EMAIL_IS_VALID != 'No'
      AND U.user_primaryemail NOT IN ( 'josh@test.com' )
于 2011-07-18T19:29:58.173 に答える
0

それで、私がやったことは2つあります。インデックスを追加し、テーブルを再最適化しました。これは少し役に立ちました。次に、systemtag サブクエリを完全に抽出して変数に格納し、それをより大きなクエリにプラグインしました。サブクエリにかかった時間はわずか 0.2 秒でしたが、20,000 のユーザー データベースの反復ごとにサブクエリが実行されていたに違いありません。皆様のご指導、本当にありがとうございました。

于 2011-07-18T21:28:19.453 に答える