我该怎么办?
想象一下网球比赛。
操作人员按按钮(动作) "Ace“、”故障“、”胜利者“、”非强制错误“等。我们有很多来自用户的数据库请求(~每分钟1000)。
存储match_id、播放器、动作、time_of_action的最佳方式是什么?
1)表,每匹配1行: match_id,actions。动作,播放器,时间戳被编码成一个字符串#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主键)一天后它将是250 K行(每次比赛300次*在1场比赛中40场*每天20场比赛)。
还有什么是更好的:很多行和很多请求从match_id =N或相同请求数的分数中选择player、match_id、时间戳,减少行数( /300 ),但行中的数据要大得多?
对于我丑陋的语言,我希望你能理解我,如果你不理解,告诉我
添加:我将使用它进行现场或比赛后的比赛统计。用户打开match Federer - Nadal的页面统计数据和每10-30秒页面刷新示例:GB/slamtracker/index.html&syn=none&
发布于 2014-12-22 15:07:13
我建议您创建名为
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就是为这类应用而开发的。不过,当您的站点开始接收大量的用户流量时,您可能应该安排每隔几秒钟运行这些查询一次,缓存结果,并使用缓存的结果向用户发送信息。
如果您希望检索当前活动的所有匹配的匹配If (即,在最后十分钟内使用一个事件),您可以这样做。
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)
上创建一个额外的索引。
https://stackoverflow.com/questions/27604741
复制相似问题