我在一个正在处理的网站上有点奇怪
此查询需要六秒钟才能运行
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万行。
答案 0 :(得分:2)
除性能问题外,您的查询可能存在语义问题,如下所述。
拥有GROUP BY
但没有聚合功能通常会带来麻烦。每组有多少行?它可以是&#34;总是一个&#34;或者&#34;有时不止一个&#34;
GROUP BY
以sum()
或group_concat()
那么我们就知道它的价值。没有这样的功能答案是
不明确的。)请参阅此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的行数。