2016-08-08 54 views
0

每個用戶都可以投票給任何影片,我們目前正在使用MySQL,但現在我們有超過200萬條線單表的字段是這樣的:我應該使用mysql還是ssdb來存儲like/vote數據?

id 
user_id  # the voter 
video_id # voted video 
author_id # author of the video 
state  # 1 for normal and 0 for cancelled, maybe others 
created_at 

最常見的查詢得到的特定選民視頻,但也許需要某些作者的視頻選民,或某些用戶投票的視頻,通常按時間排序。

我應該分片表爲100個碎片(由VIDEO_ID),或使用SSDB呢?

如果我選擇前者,爲了通過AUTHOR_ID或USER_ID查詢,數據必須存儲幾次。

如果讓我選擇SSDB,我想我應該用有序集合,並存儲時間戳作爲得分進行排序,併爲每個用戶或視頻幾個按鍵,以便通過不同領域的查詢和處理不同的狀態。而且很難更改代碼並遷移數據。

+0

什麼是「ssdb」? –

+0

100個碎片 - 你願意購買100臺服務器?(「Sharding」意味着單獨的服務器。) –

回答

1

有同樣的困惑。 我所做的是將兩者一起使用:

  • Redis用於緩存熱數據;
  • 用於持久數據的MySQL;

毫無疑問,更多的Redis鍵會帶來更多的複雜性,但是必須有一個緩存模塊來減少對MySQL的查詢。

而且因爲我只使用Redis的作爲高速緩存,其中的數據可以隨時扔掉了:我可以從MySQL建立與數據在Redis的新的數據結構

,我個人不知道。希望僅將所有數據放入Redis中:內存比IAAS上的硬盤貴得多。

願望這有助於:)

+0

Redis是MySQL的最佳解決方案 - 在最常用的Redis數據中。 –

0

如果你使用MySQL去,你需要在一些細節上的意見...

CREATE TABLE Votes (
    # id -- no need for this 
    user_id INT UNSIGNED NOT NULL,  # the voter 
    video_id INT UNSIGNED NOT NULL, # voted video 
    author_id INT UNSIGNED NOT NULL, # author of the video 
    state TINYINT UNSIGNED (or ENUM) NOT NULL, # 1 for normal and 0 for cancelled, maybe others 
    created_at TIMESTAMP NOT NULL, 
    PRIMARY KEY(video_id, user_id), -- see note 
    + some indexes; see below 
) ENGINE = InnoDB; 

目前還不清楚會唯一標識記錄。我猜對了一些事情,但我假設用戶只能投票一次。

INT UNSIGNED假設你不會有超過4個十億IDS。它需要4個字節,而不是在8個字節的BIGINT。如果您不需要超過16M個ID,請使用MEDIUMINT UNSIGNED(僅3個字節)。

「最常見的查詢得到具體視頻的選民。」 (?不「的投票數」)

SELECT user_id FROM Votes WHERE video_id = ?; 
# INDEX(video_id, user_id) -- not needed, assuming the PK specified above. 
-- or 
SELECT user_id FROM Votes WHERE video_id = ? ORDER BY created_at; 
INDEX(video_id, created_at, user_id) 

「但也許由某個作者的視頻選民」(好像video_id這裏無關緊要):

SELECT user_id FROM Votes WHERE author_id = ?; 
INDEX(author_id, user_id) 
-- or 
SELECT user_id FROM Votes WHERE author_id = ? ORDER BY created_at; 
INDEX(author_id, created_at, user_id) 

「或某些用戶投票影片也需要,通常按時間排序。「

SELECT video_id FROM Votes WHERE user_id = ? ORDER BY created_at; 
INDEX(user_id, created_at, video_id) 

有了這些建議,查詢將是相當快的。此外,MySQL將做它自己的緩存,因此增加一個緩存層可能不會幫助(尤其是如果它剝奪RAM)。

這個表格需要幾個GB。

相關問題