0

目前,我有一张桌子,而且它的填充速度非常快。我有 50 台设备。我每 30 秒从每个设备收集一次数据。因此,在我们添加 10,000 台设备后,它们每月将生成 876,000,000 条记录——这非常多!

INSERT INTO unit_data
(`id`,`dt`,`id_unit`,`data1`,`data2`,
`ip`,`unique_id`,`loc_age`,`reason_code`,
`data3`,`data4`,`Odo`,`event_time_gmt_unix`,
`switches`,`on_off`,`data5`)

这是我的人际关系

  PRIMARY KEY (`id`),
  UNIQUE KEY `id_unit_data_UNIQUE` `id`),
  KEY `fk_gp2` (`id_unit`),
  KEY `unit_dt_id` (`dt`,`id_unit`),
  KEY `unit_id_dt` (`id_unit`,`dt`),
  CONSTRAINT `fk_gp2` FOREIGN KEY (`id_unit`) REFERENCES `unit` (`id_unit`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1049392 DEFAULT CHARSET=utf8$$

我面临着非常复杂的查询和报告,当我这样做时,我们的系统没有响应并达到执行超时。(这是超过 200 万条记录)

我需要重新思考和重新实现数据库结构。目前我正在考虑

  • 为每个单元创建新表
  • 为每个月的每个单位创建新表

你有什么建议?

4

1 回答 1

0

创建新表是个好主意,但你不需要实现它,MySql 已经有这样的工具 - google 关键字“mysql+partitioning”。我建议使用它,因为您不需要更改查询,mysql 本身关心它。只需在您的创建表语句中添加“partition by”关键字即可。

给您的另一个技巧:我建议您将大量信息收集到某个大表中,并且有时还从中选择一些数据。但是插入许多新行会导致表被锁定(对选择不可用)并重建索引(我确定您的表已被索引)。在我当前的项目中,我正在做与您类似的事情,我建议您执行以下操作:

1) 创建 BIG-TABLE 的表克隆。它应该与 BIG-TABLE 具有相同的结构,但有一个区别 - 表克隆没有索引。

2)当您从设备接收数据时,将其放入表克隆中。

3)编写一些机器人代理,它将每小时或每天将小表中的记录放入大表中 - 这取决于你,但最好的情况是选择这样的间隔,表的大小将足够小以进行全扫描(记住,它未编入索引)。

4)当你想执行 SELECT 查询时,你在 2 个表中执行 - 在索引 BIG 表中 - 足够快,因为没有人尝试将数据插入其中(有时只有机器人这样做),并且在小表中进行全扫描 - 也足够快,因为你可以保持小。

5) 机器人应该在平静的时间 c- 可能在晚上醒来。

于 2013-03-13T11:52:33.807 回答