0

私には3つのテーブルがあり、それらすべてに数百万の行が含まれる可能性があります。アクションテーブルと、アクションに関連するリアクションを保持するリアクションテーブルがあります。次に、反応にリンクされたエモートテーブルがあります。この特定のクエリでやりたいのは、特定のアクションで最もクリックされたエモートを見つけることです。私にとっての難しさは、クエリに2つではなく3つのテーブルが含まれていることです。

テーブルアクション(投稿):

PKY id
...

テーブルの反応(コメント、エモートなど):

PKY id
INT action_id (related to actions table)
...

テーブルエモート:

PKY id
INT react_id (related to reactions table)
INT emote_id (related to a hardcoded list of available emotes)
...

私が思いついたSQLクエリは基本的には機能しているようですが、テーブルに数百万行が含まれている場合は12秒かかります。SQLクエリは次のようになります。

select emote_id, count(*) as cnt from emotes
where react_id in (
   select id from reactions where action_id=2942715
)
group by emote_id order by cnt desc limit 1

MySQLの説明は次のように述べています。

id  select_type         table       type            possible_keys       key         key_len     ref     rows    Extra
1   PRIMARY             emotes      index           NULL                react_id_2  21          NULL    4358594 Using where; Using index; Using temporary; Using f...
2   DEPENDENT SUBQUERY  reactions   unique_subquery PRIMARY,action_id   PRIMARY     8           func    1       Using where

...クエリを改善するためのヒントに感謝します。アクションのリストが作成されるたびにこのクエリを呼び出すのではなく、エモートが追加されるときにのみ呼び出すことに注意してください。したがって、クエリが完了するまでに0.5秒かかる場合でも問題はありません。しかし、12は長すぎます!

4

1 に答える 1

1

これはどうですか

SELECT
    emote_id,
    count(*) as cnt
FROM emotes a
INNER JOIN reactions r
    ON r.id = a.react_id
WHERE action_id = 2942715
GROUP BY emote_id
ORDER BY cnt DESC
LIMIT 1
于 2012-12-12T12:17:26.850 に答える