私には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は長すぎます!