這是我的第一個問題在SO查詢來進行微調
我使用的查詢是::
SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
MYTABLE contaings兩億條記錄,並且列logged_date是datetime類型。
上面的查詢是在15分鐘內執行的。
任何幫助將不勝感激。
這是我的第一個問題在SO查詢來進行微調
我使用的查詢是::
SELECT column1, column2, COUNT(*)
FROM myTable
GROUP BY DATE(logged_date)
HAVING COUNT(*)>10
MYTABLE contaings兩億條記錄,並且列logged_date是datetime類型。
上面的查詢是在15分鐘內執行的。
任何幫助將不勝感激。
歡迎光臨。 最好也提供表格模式。不過,我會猜一猜:
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。我建議你看看這個。
我也擔心在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
將'column1,column2'添加到'GROUP BY'子句可能會完全改變輸出。只有在兩者都直接依賴'ldate'時才應該這樣做。 – 2012-07-15 09:18:10
如果不存在,則將索引添加到'logged_date'。並檢查'解釋選擇列1 ...'輸出 – 2012-07-15 06:34:42
添加更多信息到您的問題。是否被logged_date編入索引?什麼是執行計劃?你有沒有嘗試過? – Andre 2012-07-15 06:36:16
@juergend:感謝您的回覆,但logged_date列已編入索引 – 2012-07-15 06:37:03