如果你使用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。
什麼是「ssdb」? –
100個碎片 - 你願意購買100臺服務器?(「Sharding」意味着單獨的服務器。) –