2013-03-08 110 views
8

考慮一個網站,其中人們對他們最喜歡的顏色進行投票(+1)或向下(-1),我有兩個表格:哪個是最有效的SELECT方法,爲什麼?

其中一個列出了所有人可以投票的顏色,第二個表格記錄每個人的投票製造,是什麼顏色,是否是+1或-1。

至於獲取的總投給一個特定的顏色,這將是更有效的包括在顏色表的總分而當一個人投票有一個INSERT語句和UPDATE語句:

INSERT INTO votes (colour,vote) VALUES (red,-1); 
UPDATE colours SET score=score-1 WHERE colour='red'; 

SELECT score FROM colours WHERE colour='red'; 

或者在進行投票時只有一個INSERT語句,然後獲取分數,會更有效率嗎?

SELECT SUM(vote) AS score FROM votes WHERE colour='red'; 

我想,當有票的極少數然後選擇#2是最好的,但它的選擇#1變得更好,當票數表非常大?

是否有一些工具可以用來根據表格大小等對某些SQL查詢進行排序?

+0

啊,道歉。忘了提及記錄個人投票的表格是必需的,所以無論我選擇什麼選項,表格都需要在那裏。 – Alwayslearning 2013-03-08 10:13:50

+0

你希望你的桌子有多大? *會*是一個超過該值的點,SUM()會明顯變慢。 – 2013-03-08 10:20:46

回答

4

我個人認爲如果你想顯示一個總分(我想你會想顯示分數經常),那麼隨着投票表中的行數增加,您會發現聚合SUM查詢將花費越來越長的時間,並且不能很好地擴展。此外,如果您計劃實施僅顯示分數爲100或更高的顏色的查詢,則擁有該聚合將會使查詢更簡單,更快捷。

使用評分欄的另一個優點是,如果在將來某個日期您想清理votes表(例如,如果它變得太大),那麼您可以做到這一點,並不會失去顏色分數。

我不認爲這是不成熟的優化,我認爲這是設計一個系統與規模的頭腦,所以我會做的是創建一個實際數量的投票,顏色和查詢每分鐘的樣本數據集你期望並運行一些性能測試來評估什麼是更好的方法,因爲現在選擇正確的方法比更容易(更便宜),而不是在事情開始出錯時修復它。

+0

爲了獲得更好的想法,可以使用'BENCHMARK()'函數來確定它是否會實際達到超過這個差值的點。 – 2013-03-08 10:35:26

1

這兩個查詢之間的性能差異是微不足道的。你應該根據你想保留的信息來確定結構。

如果你只需要一個總分,然後用

UPDATE colours SET score=score-1 WHERE colour='red'; 

這將是非常快的,因爲表colours只會有幾排。

另一方面,可能有理由存儲每個用戶的投票(例如確保他們不投票兩次)。在這種情況下,爲每個投票插入一行。

INSERT INTO votes (colour,vote,user_id) VALUES (red,-1); 

但是,不要因爲您認爲它會更快而創建不必要的行的結構。

0

你是否過早地優化或者這是一個真正的問題?

第一種方法可能會更快,但您爲了優化而更改您的域模型。只要你知道你在做什麼以及它帶給你什麼壞處就可以了(可能需要更新所有投票地點的兩張表,例如導致錯誤同步)

但是你可能會考慮其他選項。例如,如果顏色數量不是很大,您可以爲其評分建立一個緩存。這將保持簡單的模型,普通的評級機制,並提供你需要的速度,減去一些內存;)

0

這種類型的優化的關鍵是什麼你想優化。存儲總和會使插入/刪除/更新花費更長時間。計算總和會影響數據查詢的性能。

如果您正在刪除或更新數據,您會很快看到預先計算總和的愚蠢行爲。當你認爲你只是在改變一個數據時,對數據的任何這樣的改變都需要修改多個記錄。

雖然,您的結構似乎只有插入 - 順便說一句好的設計選擇,因爲您會看到每一個變化。在這種情況下,問題是您是想要在每個插入上花費開銷,還是希望在「報告」一方開銷。在某些情況下,問題很簡單。

如果你有1000張票,每次你要看的總和,計算在飛行中的總和。如果每次投票有1000個金額,那麼存儲總和看起來就像是更高效的方法。

我的猜測是工作負荷處於極端之間。我的自然偏見是將數據存儲爲生成的數據,然後爲彙總和報告製作額外的表格。我會推薦以下兩種方法之一:

(1)僅保留交易數據並即時計算總和。在表格上安排索引以使得總和儘可能高效。 (2)僅保留一個表中的事務,並計算另一個表中的總和(使用觸發器或存儲過程)。這爲您提供了大多數目的所需的最新值。插入應該比在每條記錄上存儲總和更有效(因爲用戶級別的表比表中的級別小)。

您的計算投票記錄總數的建議通常不會成爲我會考慮的選項。當您需要增量投票的歷史記錄時,這將是可取的。但是,如果您正在查看歷史記錄,那麼在應用程序層執行sum計算或計算總和也是可行的選擇。

相關問題