2012-07-15 58 views
1

這是我的第一個問題在SO查詢來進行微調

我使用的查詢是::

SELECT column1, column2, COUNT(*) 
FROM  myTable 
GROUP BY DATE(logged_date) 
HAVING COUNT(*)>10 

MYTABLE contaings兩億條記錄,並且列logged_date是datetime類型。

上面的查詢是在15分鐘內執行的。

任何幫助將不勝感激。

+0

如果不存在,則將索引添加到'logged_date'。並檢查'解釋選擇列1 ...'輸出 – 2012-07-15 06:34:42

+0

添加更多信息到您的問題。是否被logged_date編入索引?什麼是執行計劃?你有沒有嘗試過? – Andre 2012-07-15 06:36:16

+0

@juergend:感謝您的回覆,但logged_date列已編入索引 – 2012-07-15 06:37:03

回答

2

歡迎光臨。 最好也提供表格模式。不過,我會猜一猜:

logged_date是一個TIMESTAMP列或一個DATATIME - 是這樣嗎?這是在該列上執行DATE()的原因。

你最好的選擇,如果這是你希望優化查詢,是添加另一個列,這是logged_date_day(名字已經是混亂的,第二個之多:))

這意味着同時支持兩者(但我的下一個猜測是你只有INSERT它一個,不要再更新 - 所以這不是太努力)。

然後,您需要爲新列編制索引,並在該列上執行GROUP BY

PS

從技術上講,SELECT column1 FROM some_table GROUP BY another_column是不是有效的查詢。 MySQL允許它在您的sql_mode不包含ONLY_FULL_GROUP_BY。我建議你看看這個。

0

我也擔心在logged_date分組但顯示列1和2,這可能不會得到預期的結果,所以最好組上所有的cols或使用像最大的功能或周圍COLUMN1閔和2

不過,你可能會考慮這樣的事情:

使組確保一切由是togther鍵:

alter table myTable add key (logged_date (10), column1,column2); 

更改的查詢:

SELECT left(logged_date,10) as ldate , column1, column2, COUNT(*) 
FROM  myTable 
GROUP BY ldate,column1,column2 
HAVING COUNT(*)>10 
+0

將'column1,column2'添加到'GROUP BY'子句可能會完全改變輸出。只有在兩者都直接依賴'ldate'時才應該這樣做。 – 2012-07-15 09:18:10