2013-04-12 52 views
0

我一直在思考下面的表結構保持歷史:維護大量歷史數據的有效

`id` bigint unsigned not null auto_increment, 
`userid` bigint unsigned not null, 
`date` date not null, 
`points_earned` int unsigned not null, 
primary key (`id`), 
key `userid` (`userid`), 
key `date` (`date`) 

這將允許我這樣做有它的聲望圖,從而不會(在那裏我可以看到我加入該網站後我的代表增益)。

這裏的問題,雖然我只是跑了一個簡單的計算:

SELECT SUN(DATEDIFF(`lastclick`,`registered`)) FROM `users` 

結果是儘可能接近沒什麼區別25,000,000個工日。如果我打算每天每個用戶保留一行,那就是一張大表,我期待着進一步的增長。即使我排除了用戶不上網的日子,這仍然很大。

任何人都可以提供任何意見,維護如此大量的數據?將在該表上運行的唯一的疑問是:

SELECT * FROM `history` WHERE `userid`=? 
SELECT SUM(`points_earned`) FROM `history` WHERE `userid`=? AND `date`>? 
INSERT INTO `history` VALUES (null,?,?,?) 

請問ARCHIVE引擎有什麼用處這裏,例如?或者我只是不需要擔心,因爲索引?

+0

請爲用戶和歷史記錄添加完整的表結構 – Stephan

+0

您使用的是什麼rdms? MySQL的? – Stephan

回答

1

假設它的MySQL:

  1. 對歷史表,你應該考慮partitioning可以設置最佳的分區規則,你看着什麼查詢你有2種選擇:
    一個。按日期分區(例如1分區= 1個月)
    b。通過用戶分區(假設你有300個分區和1分= 100000個用戶)
    這將幫助你配發,如果你將使用分區修剪(here

  2. 你可以使用一個綜合指數爲用戶,日期(它將用於第2個查詢)

  3. 避免INSERT聲明,當你有大量的數據使用LOAD DATA(這不會工作表被分區)

而且最重要的...海量數據的最佳引擎是MyISAM