0

そのため、500 万件のレコードを含むデータベースがあり、Q&A サイトの情報が保存されています。構造は...

question, qid, quserid, answer, auserid;

(qid は質問の ID 番号です)

特定のユーザーが回答していない質問があるすべてのユーザーを見つけて、特定のユーザーが回答していない質問の量で並べ替えようとしています。これが私のクエリです:

SELECT quserid, COUNT(quserid)
FROM `qanda` 
WHERE qid NOT IN (SELECT qid FROM `qanda` WHERE auserid='myusername' GROUP BY qid) 
GROUP BY quserid 
ORDER BY COUNT(quserid) DESC 
LIMIT 0,1000;

問題: 2 時間以上かかっており、時計はまだ刻々と過ぎています! このデータベースを高速化する方法を知っている人はいますか? データベースか何かにバグがあると思います。通常、単純なクエリにせいぜい 30 秒しかかからないので、これは少しばかげています。微調整を知っている人はいますか?おそらく、構成ファイルまたは何かへの単純な変更ですか?

..........

これは、コピーして貼り付けたばかりのデータベースからのデータです。フォーマット不足で申し訳ありません。

you could have any one person in the entire wor...  greendaystud    ive got the person i want...its great...because sh...   •glitter•rock•  191437  If you could have any one person in the entire wor...   just~another~slave2tears    i already got em
                            •glitter•rock•  191437  If you could have any one person in the entire wor...   korn_chick2007  matt or chris... i have feelings for them
                            •glitter•rock•  189555  why are you so sexy?
    just~another~slave2tears    my b/f says i am...i dun tink so tho
                            •glitter•rock•  189555  why are you so sexy?
    korn_chick2007  im not
                            •glitter•rock•  189555  why are you so sexy?
    MyKool-AidsSexy     i dont think i am
                            †brokengirl†    115228  If you are supposed to expect the unexpected,
doe...  death-tone  yip
                            †brokengirl†    115228  If you are supposed to expect the unexpected,
doe...  _doieverknowwhoiam_     you know whats weird? my friend sandy says that a ...
                            †brokengirl†    115228  If you are supposed to expect the unexpected,
doe...  Cute_Physco_kitty   Pretty much..
                            †brokengirl†    115228  If you are supposed to expect the unexpected,
doe...  Leslie02    WHAT! OK, now im confused!
                            †brokengirl†    114995  Why does my listerine taste like sausage this
mor...  death-tone  what's listerine?
                            †brokengirl†    114995  Why does my listerine taste like sausage this
mor...  _doieverknowwhoiam_     i don't know, and maybe it's jut me bu...
                            †brokengirl†    114995  Why does my listerine taste like sausage this
mor...  darksunofdeath  How old is the listerine pack?
                            †brokengirl†    114995  Why does my listerine taste like sausage this
mor...  Cute_Physco_kitty   uhh... New brand of Listerine?
    †brokengirl†    114995  Why does my listerine taste like sausage this
mor...  Leslie02    did you have sausage for breakfast?     †brokengirl†    104305  What should I name my pinky toe on my left
foot?¿...   death-tone  "Pinkytoe"        

そして、便利な列タイトルを使用した予想される出力...

Questioner User ID | Number of questions asked by the Questioner that were unanswered by 'myuserid'

Greenbay Packer | 6
DollyDoll | 63
PsychoticPokemon | 62
HelloKitty | 61
GreenDayFan | 60

...

IDontAskManyQuestion | 2<br>
WhatsAQuestion? | 1<br>

そして、ここに EXPLAIN 出力があります

> mysql-> EXPLAIN
>     ->
>     -> SELECT quserid, COUNT(quserID)
>     -> FROM `qanda`
>     -> WHERE qid NOT IN (SELECT qid FROM `qanda` WHERE auserid='boxocereal' GROU P BY qid)
>     -> GROUP BY quserid
>     -> ORDER BY COUNT(quserid) DESC
>     -> LIMIT 0,1000;
> 

+----+--------------------+-------+------+---------------+------+---------+-----
> -+---------+----------------------------------------------+ | id | select_type        | table | type | possible_keys | key  | key_len |
> ref  | rows    | Extra                                        |
> +----+--------------------+-------+------+---------------+------+---------+-----
> -+---------+----------------------------------------------+ |  1 | PRIMARY            | qanda | ALL  | NULL          | NULL | NULL    |
> NULL  | 3167995 | Using where; Using temporary; Using filesort | |  2
> | DEPENDENT SUBQUERY | qanda | ALL  | NULL          | NULL | NULL    |
> NULL  | 3167995 | Using where; Using temporary; Using filesort |
> +----+--------------------+-------+------+---------------+------+---------+-----
> -+---------+----------------------------------------------+ 2 rows in set (0.02 sec)
> 
> mysql->
4

4 に答える 4

2

さて、これをサブクエリではなく JOIN に変換するアイデアがあります。テクニックは、実際にそこに参加、そのユーザーから回答し (根本的により効率的であるため)、最終結果からそれらの質問を除外することです (HAVING)。これはさらに改善される可能性があります (私はテストしていませんが、代わりに IS NULL チェックを WHERE 句に移動できる可能性があります)。

これはあなたがなりたい場所にあなたを連れて行きますか?

SELECT question.quserid, COUNT(question.quserid) as num_questions
FROM qanda as question 
LEFT OUTER JOIN qanda as answers 
  ON question.qid = answers.qid AND answers.auserid = 'myusername'
GROUP BY question.quserid
ORDER BY num_questions DESC
HAVING answers.auserid IS NULL;

編集:これが近く、他の誰かがアイデアを解決策に絞り込むのを助けることができる場合に備えて、もう少し説明します。

基本的に、クエリの主要部分はすべての質問を 1 回だけ選択し (LEFT OUTER)、関心のあるユーザーが回答した質問については、JOIN された列も選択します。これにより、候補の結果セットにすべての質問が含まれ、関心のない質問 (つまり、null 以外の結合列) に「フラグ」が付けられた状態になります。次に、null 以外の結合データを含む行をグループ化して拒否します。

于 2012-06-24T08:36:02.230 に答える
0

@ctraheyの回答を参照して、クエリを変更し、@ ctraheyがここに示すように出力を提供していなかったため、ソリューションが機能するようになりました。

試してみて、これが速いかどうか教えていただけますか?

SELECT question.quserid, COUNT(question.quserid) as num_questions
FROM qanda as question 
LEFT OUTER JOIN qanda as answers 
  ON question.qid = answers.qid AND answers.auserid = 'user2'
WHERE answers.auserid IS NULL
GROUP BY question.quserid
ORDER BY num_questions DESC;

sqlfiddleも参照してください。あなたのクエリと上記のクエリは同じ出力を与えています。

これがあなたが望んでいたものであることを願っています。

于 2012-06-24T09:13:50.870 に答える
0

Try this one, too:

SELECT quserid, COUNT(*) AS num
FROM qanda
WHERE qid NOT IN 
        ( SELECT qid
          FROM qanda 
          WHERE auserid = 'user2' 
        )  
GROUP BY quserid 
ORDER BY num DESC 
LIMIT 0,1000 ;

You'll definitely need to add indices for any of these variants to be efficient.

Is the (qid, quserid, auserid) the PRIMARY key? Is it UNIQUE (I guess it should be one of the two.

An index on (quserid, qid) would also help (if your table uses the InnoDB engine).

于 2012-06-24T09:18:15.143 に答える
0

出力に基づいて、フル テーブル スキャンが発生している場合にインデックス作成を実装できる候補を探します。

于 2012-06-24T08:35:01.040 に答える