在MySQL中存储带有时间戳的大量数据的最佳方法

时间:2014-12-22 14:34:03

标签: mysql algorithm

我应该做什么?

想象一下网球比赛。

操作员按下按钮(动作)“Ace”,“Fault”,“Winner”,“Unforced error”等 我们有很多运营商,同时匹配。我们向用户提出了大量的db请求(每分钟大约1000次)。

存储match_id,player,action,time_of_action的最佳方法是什么?

1)每个匹配1行的表:match_id,actions。动作,玩家,时间戳编码为1个字符串#of player TINYINT id of action CHAR timestamp TIMESTAMP

例子:actions =“1A2014-11-28 09:01:21 2W2014-11-28 09:01:33 1F2014-11-28 09:01:49”

2)一个匹配多行的表:id,match_id,player,action_id,当前时间戳(id PRIMARY KEY) 一天之后它将是大约250K行(每场比赛300个*每场比赛40场比赛*每天20场比赛)

什么是更好的:很多行和很多请求SELECT player,action_id,timestamp FROM scores WHERE match_id = N 要么 相同数量的请求,更少的行(/ 300)但行中的数据要大得多?

对于我丑陋的语言,我希望你能理解我,如果没有,请告诉我

添加: 我将把它用于现场或赛后的比赛统计。 用户打开页面匹配费德勒 - 纳达尔的统计数据和每10-30秒页面刷新一次 示例:http://www.wimbledon.com/en_GB/slamtracker/slamtracker.html?ts=1419259452680&ref=www.wimbledon.com/en_GB/slamtracker/index.html&syn=none&

1 个答案:

答案 0 :(得分:2)

我建议你创建名为

的参考表
 match    match_id, name, venue          A row for each distinct match
 player   player_id, name                A row for each distinct player 
 action   action_id, name                This is a codelist  1=Ace  2=Fault, etc.

这些表格相对静止。

然后,我建议您按以下顺序创建一个包含以下项目的事件表。

match_id
ts            (TIMESTAMP)
action_id
player_id

您应该按照我显示的顺序在复合主键中包含所有这四列。

每次记分员记录动作时,您都会在此表中插入新行。

如果要显示特定匹配项的操作,可以执行以下操作:

SELECT event.ts,
       action.name AS action,
       player.name AS player
  FROM event
  JOIN player ON event.player_id = player.player_id
  JOIN action ON event.action_id = action.action_id
 WHERE event.match_id = <<whatever match ID>> 
 ORDER BY event.match_id, event.ts

由于event表上复合主键中列的顺序,即使您向该表插入大量新行,这种查询也会非常有效。

MySQL是为这种应用程序而制作的。但是,当您的站点开始接收大量用户流量时,您可能应该安排每隔几秒运行一次这些查询,缓存结果,并使用缓存结果向用户发送信息。

如果要检索当前活动的所有匹配项(即最近十分钟内的事件)的匹配ID,您可以执行此操作。

SELECT DISTINCT match.id, match.name, match.venue
  FROM event
  JOIN match on event.match_id = match.match_id
 WHERE event.ts >= NOW() - INTERVAL 10 MINUTE

如果您需要进行大量的查询,我建议您在(ts, match_id)上创建一个额外的索引。