PHP中的MySQL查询优化

时间:2012-12-12 12:11:46

标签: mysql pdo

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

表格操作(发布):

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太长了!

1 个答案:

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