2009-07-08 75 views
1

我正在嘗試優化需要相當一段時間的MYSQL語句。這個表運行的表是600k +,查詢超過10秒。Mysql優化

SELECT DATE_FORMAT(timestamp, '%Y-%m-%d') AS date, COUNT(DISTINCT (
email 
)) AS count 
FROM log 
WHERE timestamp > '2009-02-23' 
AND timestamp < '2020-01-01' 
AND TYPE = 'play' 
GROUP BY date 
ORDER BY date DESC 

我只是索引時間戳和類型,還有一個timestamp_type(type_2)。

這裏是解釋結果,這個問題似乎是一個文件排序,但我不知道如何解決這個問題?

id: 1 
select_type: SIMPLE 
table: log 
type: ref 
possible_keys: type,timestamp,type_2 
key: type_2 
key_len: 1 
ref: const 
rows: 226403 
Extra: Using where; Using filesort 

感謝

+0

你能表現出與SQL代碼的當前indexe定義,因此沒有關於他們是如何設置的懷疑。 另外,我們在談論什麼數據量? (有多少行,多少個「TYPE」,每個TYPE和時間戳有多少行?) – Brimstedt 2009-07-08 11:08:09

回答

4

事情嘗試:

  • 有一個單獨的date列(索引)並使用它,而不是你timestamp
  • 添加一個索引跨typedate
  • 利用之間(不認爲這會影響速度,但它更易於閱讀)

所以最好你會

  1. 創建date柱上,用UPDATE table SET date = DATE(timestamp)填充
  2. 指數跨越typedate
  3. 將您的選擇更改爲... type =?和日期之間?和?
+0

這是一個很好的建議 - 很明顯,不要把你的專欄稱爲'日期'。 – Fenton 2009-07-08 10:45:25

0

嘗試重寫以先在TYPE上過濾。然後應用您的日期範圍和彙總。基本上創建一個內聯視圖,用於過濾掉類型。我知道優化器可能已經這樣做了,但是當試圖提高性能時,我發現確定首先發生的事情會很有幫助。

0
  1. DATE_FORMAT不會使用索引。

  2. 仍然可以使用下面的查詢來利用索引上時間戳列

    SELECT時間戳作爲日期,COUNT(DISTINCT( 電子郵件 ))AS計數 FROM登錄 其中timestamp> '2009-02-23 00:00:00' 和時間戳< '2020年1月1日23:59:59' 和type = '玩' GROUP BY日期 ORDER BY日期DESC

  3. 格式打印時的日期時間值日期/使用