2010-04-21 59 views
0

此查詢的目標是每個參考ID獲得唯一記錄(IP最新,IP)。Mysql - GROUP BY避免使用tempoary

SELECT COUNT(DISTINCT ip), GROUP_CONCAT(ref.id) 
FROM `sess` sess 
JOIN `ref` USING(row_id) 
WHERE sess.time BETWEEN '2010-04-21 00:00:00' AND '2010-04-21 23:59:59' 
GROUP BY ref.id 
ORDER BY sess.time DESC 

該查詢工作正常,但它使用臨時表。有任何想法嗎?

row_id是兩個表上的主要字段。 sess.time,sess.ip和ref.id都是索引。

+0

您可以添加EXPLAIN嗎? – Unreason 2010-04-21 21:22:56

回答

0

由於GROUP_CONCAT可能使用臨時表。但這真的是一個問題嗎?查詢速度太慢還是您不喜歡臨時表?

+0

我嘗試避免使用這麼多行時的臨時表(每天50k +)。我需要時間跨越日/月/年。我想也許是時候創建另一個彙總表了? – jwzk 2010-04-21 21:10:06

+0

如果您需要更長時間的數據,且數據量超過我建議創建彙總表的數量。我沒有看到一種方法可以在MySQL中使這個查詢本身更簡單/更快。也許如果你用'ref.id'命令它可以省略臨時表,但我懷疑它。 – Wolph 2010-04-21 22:43:07

2

我很難理解這個查詢是如何合理的。如果您有GROUP BY ref.id,爲什麼使用GROUP_CONCAT(ref.id)?根據定義,每組只能有一個值爲ref.id

也是你ORDER BY sess.time即使sess可能有多個值爲每組time。你想用排序中的哪一行?

我同意調用臨時表的查詢通常在MySQL中有性能問題。臨時表通常會寫入磁盤,因此您會在分組&時得到昂貴的磁盤I/O。

你能編輯你的問題並顯示錶格定義(SHOW CREATE TABLE將是最好的)嗎?也請描述查詢應該代表什麼。那麼我們將有更好的機會向您提供一些關於如何重寫它的建議。