【发布时间】: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