【问题标题】:Database design for heavy timed data logging - Car Tracking System用于重定时数据记录的数据库设计 - 汽车跟踪系统
【发布时间】:2018-12-24 12:35:53
【问题描述】:

我正在制作汽车跟踪系统,我想将每辆汽车每 5 秒发送一次的数据存储在 MySql 数据库中。假设我有 1000 辆汽车在 5 秒后将数据传输到我的系统,并且数据存储在一个表中。在某些时候,我想查询此表以生成特定车辆的报告。我在将所有车辆数据记录在一个表中或为每辆车创建一个表(1000 个表)之间感到困惑。哪个效率更高?

【问题讨论】:

    标签: mysql performance database-design monitoring database-performance


    【解决方案1】:

    OK 86400 秒/天 / 5 = 每辆车每天 17280 条记录。 每天将产生 17,280,000 条记录。一般来说,这对 MYSQL 来说不是问题。 一个设计好的表将很容易查询。 如果您为每辆车选择一张桌子 - 什么时候,将来会有 2000 辆汽车。 但问题也是:您希望将数据存储多长时间? 当您的数据库是 200 GB、800GB、2TB 时,很容易计算出......

    【讨论】:

    • 感谢威廉的回答。如果我不打算删除数据怎么办,我会一直保留所有记录以备将来参考。
    【解决方案2】:

    一张桌子,而不是每辆车一张桌子。当您尝试备份或维护一个包含 1000 个表的数据库时,它将成为垃圾箱之火。

    尽可能缩短该表的行;它会有很多记录。

    在时间戳和 (car_id, timestamp) 上都对该表进行索引。第二个索引可让您有效地报告个别汽车。

    阅读https://use-the-index-luke.com/

    【讨论】:

    • 谢谢琼斯,这很有帮助。
    • 更重要的是,让PRIMARY KEY (car_id, timestmap, ...) 开头,这将为更重要的查询提供“集群”。同时,INSERTs 将达到 1000 个“热点”,因此它们仍然非常有效。
    【解决方案3】:

    这是“冰山一角”。这里和 dba.stackexchange 上大约有 5 个线程与跟踪汽车/卡车有关。以下是一些进一步的提示。

    • 保持数据类型尽可能小。您的表将变得巨大 - 威胁要溢出磁盘,并且由于“庞大的行意味着可以在 RAM 中缓存的行更少”而减慢查询速度。
    • 对于整夜闲置的汽车,您是否保留“相同”的信息?想想这占用了多少磁盘空间。
    • 如果您使用 HDD 磁盘,请在需要重新设计摄取过程之前以 100 INSERTs/秒的速度运行。 (SSD 为 1000/秒。)有些技术可以为您提供 10 倍,也许是 100 倍,但您必须应用它们。
    • 您是否会让多台服务器收集数据,然后对数据库执行简单的插入操作?我的观点是可能是你的第一个瓶颈。
    • PRIMARY KEY(car_id, ...) 以便高效访问一辆车的数据。
    • 今天,您说数据将被永久保存。但是您计算过您的磁盘需要多大吗?
    • 一种大幅缩减数据的方法是将“旧”数据合并到例如一个月后的 1 分钟间隔中。开始考虑你想保留什么。例如:最小/最大/平均速度,而不仅仅是瞬时速度。当发生任何重大变化(发动机开启、发动机关闭、安全气囊展开等)时,有额外的记录
    • (我可能有更多提示。)

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2018-12-02
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多