GROUP BY慢速查询日期

时间:2017-01-19 21:54:16

标签: mysql

我在一个正在处理的网站上有点奇怪

此查询需要六秒钟才能运行

SELECT `z_tv_episodes`.*, `title`.*, `z_networks`.*
FROM `z_tv_episodes`, `title`, `z_networks_title`, `z_networks`
WHERE `season_number` = 1
AND `episode_number` = 1
AND `episode_airdate` < "2017-01-19"
AND `z_tv_episodes`.`media_id` = `title`.`media_id`
AND `has_poster` = 1
AND `title`.`media_id` = `z_networks_title`.`media_id`
AND `z_networks_title`.`network_id` = `z_networks`.`network_id`
GROUP BY `z_tv_episodes`.`media_id`
ORDER BY `episode_airdate` DESC
 LIMIT 6 

我意识到GROUP BY是它如此缓慢的原因。向episode_airdate和media_id添加多列索引没有帮助。 区别使它好,但后来我没有我需要的列。任何帮助都会很棒。

episode_airdate&lt; “2017-01-19”匹配大约30万行。

2 个答案:

答案 0 :(得分:2)

除性能问题外,您的查询可能存在语义问题,如下所述。

拥有GROUP BY但没有聚合功能通常会带来麻烦。每组有多少行?它可以是&#34;总是一个&#34;或者&#34;有时不止一个&#34;

  1. 如果每组中总共有一行,那么您甚至不需要 一个GROUP BY
  2. 开头
  3. 如果至少有一个组可能有多个行,则为此 group(s),现在有多个值的列应该是什么值? (如果您有聚合函数,例如sum()group_concat() 那么我们就知道它的价值。没有这样的功能答案是 不明确的。)
  4. 请参阅此SO文章以了解该问题:

    Why does MySQL allow "group by" queries WITHOUT aggregate functions?

    在您的特定情况下,我建议您首先通过在查询中添加一行来检查您的情况是上面的#1还是#2。然后我们可以从那里拿走它。

    SELECT 
        `z_tv_episodes`.*
        , `title`.*
        , `z_networks`.*
        , count(*) -- <----------- add this line
    FROM 
        `z_tv_episodes`
        , `title`
        , `z_networks_title`
        , `z_networks`
    WHERE 
        `season_number` = 1
        AND `episode_number` = 1
        AND `episode_airdate` < "2017-01-19"
        AND `z_tv_episodes`.`media_id` = `title`.`media_id`
        AND `has_poster` = 1
        AND `title`.`media_id` = `z_networks_title`.`media_id`
        AND `z_networks_title`.`network_id` = `z_networks`.`network_id`
    GROUP BY `z_tv_episodes`.`media_id`
    ORDER BY `episode_airdate` DESC
    LIMIT 6 
    

答案 1 :(得分:0)

我会发布一个答案,以防其他人在这里结束。我所做的是添加另一个日期参数,使其如下所示:

AND `episode_airdate` < "2017-01-19"
AND `episode_airdate` > "2016-12-19"

这大大减少了MYSQL最终必须使用GROUP的行数。