0

我有三个表,它们都可能有数百万行。我有一个动作表和一个反应表,其中包含与动作相关的反应。然后有一个与反应相关的表情表。我想对这个特定查询做的是为某个动作找到点击次数最多的表情。对我来说困难在于查询包括三个表而不是只有两个。

表操作(过帐):

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 回答