2012-09-10 89 views
0

我正在一個項目中,我有投票選項向上和向下類似於StackOverFlow。我沒有太多的經歷在DB設計,因此我得到了下面的問題,數據庫設計的投票按鈕

首先,這裏是我的投票表結構:

  1. voteId -----用AUTO_INCREMENT首要的關鍵。
  2. mediaId ----用戶提供向上/向下投票的媒體。
  3. userId -----投票的用戶。
  4. voteMode --- 1表示向上投票,0表示向下投票。這是一個整數字段。

在這種情況下,如果我有100個用戶和100個媒體,那麼我將在此表中有100x100條記錄。

問題出現在這裏是數據庫正在起牀與大量的記錄和投票按鈕是死緩慢現在反應。這讓我的客戶不高興,而我陷入困境。

任何人都可以建議我一個更好的模型,以避免這張巨大的表?

我正在使用jQuery.ajax發佈我的投票到服務器。此外,該項目基於PHP和Zend Framework 1.11。所以當我點擊UP圖標時,需要一些時間來回應。 Mozilla曾經在某些時候崩潰。 我通過一個循環插入大量垃圾記錄(大約15000)進行測試。

+1

你使用任何索引?什麼查詢很慢? –

+0

您使用的PHP框架是(或應該)與數據庫結構完全無關。而這更多的是因爲你使用JQuery。你可以編寫一個投票桌面應用程序,仍然需要相同的數據庫。不要讓這些事情混亂你的決策。 – GolezTrol

+0

不,我不是。韋恩不太熟悉。我從來沒有嘗試過很多數據庫。 –

回答

1

你可以嘗試這些了漸變的表架構的:

//All id's are now unsigned , As you do not need any sign 
ALTER TABLE `voting` 
CHANGE `voteid` `voteid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
CHANGE `mediaId` `mediaId` INT(11) UNSIGNED NOT NULL, 
CHANGE `userId` `userId` INT(11) UNSIGNED NOT NULL, 
//ENUM datatype as you need only 2 type of value 
CHANGE `voteMode` `voteMode` ENUM('1' , '2') NOT NULL ; 

//Adding index , it will surely increase some speed 
//Do **not use** index in **columns you do not need** 
ALTER TABLE `voting` ADD INDEX ( `mediaId` , `userId`) ; 

去走遍Mysql Index更多地瞭解索引。

如果您使用MyISAM Storage Engine,那麼我會建議您去InnoDB Storage EngineIt可能會幫助您決定應該使用哪個引擎。

和其他一些黑客,可以幫助你:

  1. MySQL Query Cache
  2. Prepared Statements in php
  3. COLUMNS Partitioning

關於MySQL數據庫優化的一些資源:

  1. MySQL Tuning
  2. Mysql Optimization
  3. Real World Scalability MySQL
+0

感謝您的信息。讓我試試這個。 –

0

如果您想跟蹤用戶投票給x媒體的內容,並且每個用戶都投票,那麼您的最小數據量爲users * media

如果你想獲得更少的數據,你必須做出讓步。也許讓用戶註冊並匿名投票?如果可以從投票行爲中提取個人偏好,大多數用戶不會很高興。

+0

是的,任何其他方式來存儲此數據...? –

+0

「匿名投票」將允許投票欺詐。 –

+0

我有限制多次投票和匿名投票 –

1

好吧,兩件事。 15k記錄不是什麼,所以幾乎不能給出問題。我使用的是150M行和查詢下.005s

  1. 依然表現良好,我懷疑你使用MyISAM和InnoDB的不表。使用MyIsam,每個插入(或更新)都會鎖定整個表。所以,當有人投票時,表格被鎖定,其他人無法讀取。如果你有成千上萬的用戶,這可能會成爲一個問題。

  2. 確保您擁有正確的索引。我不確定哪些查詢很慢(以及速度有多慢!),但要確保您在搜索的列上有索引(可能是mediaId)。

如果您想要更好地提出建議,請發佈緩慢的查詢。

+0

其InnoDB。檢查我對你問的問題頂部 –

+0

問題我的意見這裏是它:\t 其實我使用思傑和數據庫是在裏面。這就是爲什麼我輸入的字段而不是查詢。我不能從它複製任何東西。但讓我檢查我的索引。 –

+0

還向我們顯示緩慢的查詢。 – Nin