2013-01-20 148 views
0

我想按照時間戳的小時數從MYSQL數據庫中獲取結果。時間戳以2012-12-14 03:19:09的格式存儲在表中。我用的是查詢按日期分組MYSQL結果行

SELECT 
    HOUR(`timestamp`) AS `hour`, 
    AVG(`somevalue`) AS `average` 
FROM ... 
GROUP BY 
    HOUR(`timestamp`), 
    DAY(`timestamp`), 
    MONTH(`timestamp`), 
    WEEK(`timestamp`), 
    YEAR(`timestamp`) 
ORDER BY ... 
LIMIT 0, 24; 

這工作,並返回正確的行數和值...

+------+-------+ 
| hour | value | 
+------+-------+ 
| 13 | 21.16 | 
| 12 | 21.11 | 
| 11 | 20.88 | 
| 10 | 20.93 | 
| 9 | 20.87 | 
| 8 | 20.89 | 
| ... | ... | 
+------+-------+ 

...但極其緩慢(表包含〜90K行)。我是given the advice不是按每個日期實體分組,而是按UNIX_TIMESTAMP(`timestamp`)/3600分組。這不幸的是不會導致預期的結果,結果看起來像這樣

+------+-------+ 
| hour | value | 
+------+-------+ 
| 13 | 21.20 | 
| 13 | 21.20 | 
| 13 | 21.20 | 
| 13 | 21.20 | 
| 13 | 21.20 | 
| ... | ... | 
+------+-------+ 

有什麼辦法給他們組只有一個group子句(這將使其更快),但返回正確的結果?

+0

使用多個反引號沒有在這裏工作,我(見上文)使用組。如果有人發現錯誤,我很感謝您的糾正。 –

+0

沒有試圖用當前模式解決這個問題*將避免全表掃描和文件,所以對於大型表格將變得非常昂貴。您需要更改模式,以便可以將索引分組,例如,通過在另一個(索引)列中存儲'DATE_FORMAT(時間戳,'%Y-%m-%d%H:00:00')' 。 – eggyal

回答

1

而不是做它的日期和時間

SELECT 
    HOUR(`timestamp`) AS `hour`, 
    AVG(`somevalue`) AS `average` 
FROM ... 
GROUP BY 
    DATE(`timestamp`), 
    HOUR(`timestamp`), 
ORDER BY ... 
LIMIT 0, 24; 
+0

看起來很有希望:是1.4012秒,現在是0.9345。快三分之一! –

+0

歡迎感謝! –

0
  1. 索引時間戳列。
  2. 嘗試GROUP BY DATE_FORMAT(timestamp,'%Y%m%d%H')

請注意,我自己並沒有真的試過這個。

+0

時間戳列已編入索引。 –

+0

沒有性能改進:1.5021而不是1.4012秒(約增加7%)在我的機器上。 –