我有三个表,所有表都可能有数百万行。我有一个动作表和一个反应表,其中包含与动作相关的反应。然后有一个与反应相关的表情表。我想对这个特定查询做些什么,就是为某个动作找到点击次数最多的表情。对我来说困难在于查询包括三个表而不是两个表。
表格操作(发布):
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太长了!
答案 0 :(得分: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