2014-07-06 55 views
1

我目前正在編寫一個查詢,它將在MySQL數據庫中的MYISAM表上運行多次。MYSQL Group按日期性能查詢

該查詢需要很多(可能是任何高達100,000+)的行並獲得每月總計。我正在使用的SQL是

SELECT DATE_FORMAT(ct_cdatetime, "%m-%Y") AS Month, SUM(ct_total), SUM(ct_charge) 
FROM client_transaction 
WHERE (...omitted for this example...) 
GROUP BY DATE_FORMAT(ct_cdatetime, "%m-%Y") ORDER BY ct_cdatetime ASC 

我知道迫使MySQL將日期轉換爲字符串的性能問題。會是更快的和/或更好的做法是

  • 1)保持原樣
  • 2)在一個 陣列選擇所有在PHP的行和它們組。
  • 3)在數據庫中有一個月份年份的int字段,並在添加該行時更新此 (例如2014年7月的714)?
+0

將您的month_year信息存儲在一個單獨的列中併爲其設置索引(如果這是一個經常使用或時間關鍵的查詢)。 – hellcode

回答

0

對哪個最快問題的回答很簡單:試一試並測量。

SQL方面的性能並未真正受到日期轉換的影響。它由group by決定,特別是排序。

我很懷疑傳輸數據和在應用程序方面做的工作會更快。尤其是,您必須從數據庫傳輸大量(ish)數據量到應用程序。然後,您必須在應用程序中複製將在數據庫中完成的工作。

但是,應用程序端的內存中算法可能比數據庫端更通用的算法更快。在應用程序方面進行工作可能會更快。

1

下面的查詢速度更快,因爲它只是提取而不是創建一個格式化文本的日期的組成部分:

SELECT YEAR(dtfield), MONTH(dtfield), COUNT(*) 
FROM mytable 
GROUP BY YEAR(dtfield), MONTH(dtfield); 

請記住,使用功能時,MySQL不能使用任何索引優化爲GROUP BY標準。如果你有一張大桌子,並且需要這些計算,通常會爲它們創建單獨的索引列(如noticed by hellcode)。