Mysql
帶有函式的“GROUP BY”索引
我有一個日誌表。它記錄訪問者數據(訪問時間、瀏覽器、視窗大小……)。
我想創建報告。我使用這樣的查詢(MySQL):
SELECT COUNT(*) as raw_views ... FROM logs WHERE timestamp >= CURDATE() GROUP BY DATE(timestamp)
問題是
DATE(timestamp)
。我在這個欄位上使用了一個函式,所以索引不起作用。但是桌子很大。索引非常重要。但是我還能如何創建每小時、每天、每年、每月的報告呢?我試圖了解其他人是如何做到的。例如 Piwik(一個開源的類似 Google Analytics 的腳本)。但我真的不明白。
查看原始查詢
SELECT COUNT(*) as raw_views ... FROM logs WHERE timestamp >= CURDATE() GROUP BY DATE(timestamp)
看來您正在尋找今天的計數。在那種情況下,為什麼要使用
GROUP BY
?你應該跑SELECT COUNT(*) as raw_views ... FROM logs WHERE timestamp >= CURDATE();
好的,讓我們再細一點。你說你有報告
user_id
也許可以根據使用者調整查詢
SELECT COUNT(*) as raw_views FROM logs WHERE userid = <some number> AND timestamp >= CURDATE();
在這種情況下,您可以像這樣索引:
ALTER TABLE logs ADD INDEX userid_timestamp_index (user_id,timestamp);
如果您一次性獲得所有使用者原始計數,您會像這樣查詢
SELECT user_id,COUNT(*) as raw_views FROM logs WHERE timestamp >= CURDATE() GROUP BY user_id ;
在這種情況下,您可以像這樣索引:
ALTER TABLE logs ADD INDEX timestamp_userid_index (timestamp,user_id);
這就是我所能建議的。希望這有幫助!