2017-01-19 147 views
1

我有一點對我工作的GROUP BY與日期

此查詢需要六秒網站的古怪的慢查詢運行

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 <「2017-01-19」大致匹配30萬行。

+0

請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query - 我們不需要300,000行來說明問題。 12通常就足夠了。 – Strawberry

回答

2

除了性能問題,您的查詢可能有語義問題,如下所述。

擁有GROUP BY但沒有聚合功能通常會造成麻煩。每組有多少行?它可以是「總是一個」或「有時不止一個」

  1. 如果總是有一排各組,那麼你甚至都不需要 一個GROUP BY開始與
  2. 如果有對於至少一個組可能多於一行,那麼對於那個組,那麼現在有多個值的列應該是什麼值? (如果你有一個聚合函數,如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

嗨@leeyuiwah我設法解決這個問題,通過添加一個最小episode_airdate來減少它在日期參數上匹配的行數。 count(*)返回1,但你說得對,GROUP BY根本就不需要。我不知道我怎麼會錯過這個。謝謝您的幫助 – Callombert

0

我會發佈一個答案,以防萬一有人在這裏結束。我所做的是增加一個Date參數,所以它讀取,像這樣:

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

這大大減少MYSQL最後不得不對集團的行數。