【问题标题】:Optimized mysql table schema for reading and writing data优化 mysql 表模式,用于读取和写入数据
【发布时间】:2017-08-30 10:22:08
【问题描述】:

我正在从事一个项目,该项目需要将来自多个跟踪设备的数据存储在 mysql 中。数据间隔为 10s。

目前我们存储数据的方式如下:

每个设备都有一个以 Unix 时间戳作为主键的表 ({Device_Number}_info)。 (因此,如果我们有 10,000 台设备,我们最终会在 10,000 个表中。这样做是为了防止锁定,因为我们每 10 秒插入一次表。

每 10 秒将数据插入到相应的表中,然后再进行访问。

这种方法的问题是,如果我们必须为每个设备获取一行 - 我们必须遍历所有 10,000 个表并执行查询。我们尝试了所有可能的方法来优化查询并向表中添加索引,但没有任何效果。遍历所有表并执行查询需要时间。我们的目标是在

我们尝试了什么:

我们创建了所有 10,000 个表的单一视图(采用联合)。然后查询视图。这也不起作用。需要2分钟以上。

关于我们如何设计优化读写的架构有什么建议吗?

这是 {device_number}_info 表的架构:

{device_number}_info:
  device_number int(11) NOT NULL,
  Date date NOT NULL,
  Time time NOT NULL,
  Timestamp int(10) unsigned DEFAULT NULL,
  Speed float NOT NULL,
  Latitude double NOT NULL,
  Longitude double NOT NULL,
...
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 你为什么不只用一张桌子? 1000 次插入/秒应该不是问题,插入不会锁定整个表。
  • 我们也尝试过使用单表,当数据超过十万时,查询成为瓶颈。那个时候查询太慢了!
  • 从具有数十万行的表中进行选择(不得不谷歌搜索:-))应该不是问题。也许您没有正确索引?你能发布一个SELECT的例子吗?
  • 谢谢。但是索引会减慢插入速度,对吗?在查询的“where”子句中,我们几乎拥有表中的所有字段。您是否建议索引所有字段?
  • 是的,索引会减慢插入速度。您不必对 WHERE 子句中的所有列都有索引。至少应为 where 子句中的一列建立索引,或者您正在执行全表扫描(昂贵)。文档解释了如何使用索引:dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html

标签: mysql database performance optimization schema


【解决方案1】:

正如在单独讨论中所建议的那样:

  • 将所有表合并到一个主表
  • 在查询的 where 部分使用索引列 (Timestamp) 以大大提高速度
  • 增加innodb_buffer_pool_size以减少磁盘IO时间

【讨论】:

    【解决方案2】:

    “设备”在移动吗?如果不是,请不要在表中包含 lat/lng。任何其他不变的值也是如此。

    只有一张桌子。

    PRIMARY KEY(device_id, timestamp) -- 按此顺序。请注意,这会将插入分隔到表格的不同部分。

    不要(没有充分理由)在datetime 中重复timestamp。在大多数情况下,您可以动态转换。

    DOUBLE 对于 lat/lng 来说太过分了。有关较小的选项,请参阅 this

    缩小表大小将提高性能。

    每秒插入 1000 行时,将它们分批并使用单个 LOAD DATA 或单个多行 INSERT 执行它们。这将需要一些时间,但应该远小于 10 秒(死机限制),除非在“冷”系统上。

    device_number 可以是 MEDIUMINT UNSIGNED(3 个字节而不是 4 个;限制为 16M - 1.6 千万)。

    如果您要在给定时间内获取所有设备的数据,则需要辅助INDEX(timestamp)

    请记住,更多的索引意味着更慢的INSERTs,因此请提供您认为需要的所有索引,以及它们设计用于的查询。我们应该讨论它们。

    您将数据保留多长时间?听起来像每年 300 亿行?如果您正在清除,那么DELETE 将成为一个严重的问题。我们可以讨论一下。

    多少内存? HDD 还是 SSD 驱动器?

    【讨论】:

    • 感谢您的建议!一定会尝试这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多