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