2012-10-19 55 views
1

MySQL查詢優化我有一個這樣的查詢用於非重複計數

select count(distinct sessionKey) as tot from visits

但它需要太多的時間來執行現在48512毫秒。
在幾個月在表中的數據將成爲雙data.How我可以優化此查詢

電流量這是我的表結構

enter image description here

+1

添加索引(sessionKey)。 – Devart

+1

[在MySQL中加速行計數](http://stackoverflow.com/questions/1332624/speeding-up-row-counting-in-mysql) – Khaleel

+1

index()會影響插入性能 –

回答

4

在列SessionKey添加INDEX並會改善其性能。

ALTER TABLE visits ADD INDEX (SessionKey) 
+0

我指的是'SessionKey'列。 –

+0

是其設置字段的正確索引是否會減慢插入操作? –

+1

當然是的,除此之外,它也會佔用更多的磁盤空間。 (但肯定不會太多,值得肯定)。根據您可能要等到夜晚的條目數量或嘗試的條目數量,因爲創建索引可能需要一些時間(對於一個條目來說它並不多,但對於已存在的所有數據......誰知道) – Flo

1

與其他人一樣,添加索引是首要的也是最容易做的事情。 如果你有噸和噸的線路,通過所有這些可能需要一段時間。

我曾經有過類似的問題,有人編碼系統,用戶可以在新聞條目上投票。每個投票都保存爲數據庫中的一行。在每個網頁上都有一份「最受歡迎」新聞的列表。這基本上意味着有一個查詢選擇完整的投票表,總結它們,然後排序。在多個100k的範圍內參賽,這需要一段嚴肅的時間。有人在我面前「解決」了它,試圖「緩存」結果。這在大多數情況下都很有效,但是如果你清理了所有的緩存,那麼整個頁面就會混亂幾個小時,直到緩存重新構建。然後我通過不保存每個投票在自己的行上來修復它,但只是爲每個條目進行總結。

我想告訴你的是:你可以嘗試緩存(但結果當然不會是「活的」),或者改變數據庫中的某些內容,比如添加一個字段或表格來存儲你的計數想要讀取每次插入到訪問表時更新的內容。這會在插入時創建更多的負載,但獲取該數字會非常便宜。