【问题标题】:Best way to store a lot of data with timestamp in MySQL在 MySQL 中存储大量带有时间戳的数据的最佳方法
【发布时间】:2014-12-22 14:34:03
【问题描述】:

我该怎么办?

想象一下网球比赛。

操作员按下按钮(动作)“Ace”、“Fault”、“Winner”、“Unforced error”等 我们有很多运营商,同时比赛。而且我们有很多用户对 db 的请求(每分钟约 1000 个)。

存储 match_id、player、action、time_of_action 的最佳方式是什么?

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

示例:操作 =“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 场 * 1 场比赛中的 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&

【问题讨论】:

  • 商店数据的主要考虑因素是您将如何使用它。没有这些信息,就没有关于什么是“最佳”的指导。
  • 我打算用它来统计现场或赛后的比赛数据。用户打开页面统计比赛费德勒-纳达尔和每10-30秒页面刷新示例:wimbledon.com/en_GB/slamtracker/…
  • 奥利你是最棒的! p.s.当我在俄罗斯论坛上发布类似的问题时,很多“专业人士”给我写信说我很愚蠢,白痴,新手,他们有多好。但是没有人发布答案。你们总是把我想知道的写对。信息量很大。谢谢!

标签: mysql algorithm


【解决方案1】:

我建议您创建名为

的引用表
 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)上创建一个额外的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多