Mysql

帶有函式的“GROUP BY”索引

  • July 28, 2014

我有一個日誌表。它記錄訪問者數據(訪問時間、瀏覽器、視窗大小……)。

我想創建報告。我使用這樣的查詢(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);

這就是我所能建議的。希望這有幫助!

引用自:https://dba.stackexchange.com/questions/72367