Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按带日期的慢速查询分组_Mysql - Fatal编程技术网

Mysql 按带日期的慢速查询分组

Mysql 按带日期的慢速查询分组,mysql,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`.

我在一个网站上有点奇怪

运行此查询需要六秒钟

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 
我已经意识到,这是它如此缓慢的原因。在插播日期和媒体id中添加多列索引没有帮助。 Distinct使它很好,但是我没有我需要的列。任何帮助都会很好


插曲\u airdate<2017-01-19与大约30万行匹配。

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

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

如果每组中总是有一行,那么你甚至不需要这样做 首先是一个小组 如果至少一个组可能有多行,则 组,现在有多个值的列的值应该是多少? 如果您有一个聚合函数,如sum或group_concat 然后我们就知道了它的价值。如果没有这样的功能,答案是 模棱两可的 有关问题,请参阅本SO文章:

在您的特定情况下,我建议您首先通过在查询中添加一行来检查您的情况是否高于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 

我会发布一个答案,以防万一有人来了。我所做的是添加另一个日期参数,使其如下所示:

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

这大大减少了MYSQL最终不得不分组的行数。

请参见-我们不需要300000行来说明这个问题。12通常就足够了。Hi@leeyuiwah我设法通过添加一个最小的插曲\u airdate来解决这个问题,以减少它在日期参数上匹配的行数。count*返回1,但您是对的,根本不需要分组依据。我不知道我怎么会错过这个。谢谢你的帮助