目前,我有一个表,并且它的填充速度非常快。 我有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$$
我面临着非常复杂的查询和报告,当我这样做时,我们的系统没有响应并且达到执行超时。 (这是2mil +记录)
我需要重新思考并重新实现数据库结构。目前我正在考虑
你会建议什么?
答案 0 :(得分:0)
创建新表是一个不错的主意,但你不需要实现它,MySql已经有了这样的工具 - 谷歌关键字“mysql + partitioning”。我建议使用它因为你不需要改变你的查询,mysql本身就关心它。只需在创建表格中添加“partition by”关键字。
另一个技巧:我建议你收集大量信息给一些大桌子,并有时从中选择一些数据。但是插入许多新行会导致表被锁定(不可用于选择)和重建索引(我确信您的表已被索引)。在我目前的项目中,我正在做类似于你的事情,我建议你做以下事情:
1)创建BIG-TABLE的表克隆。它应该与BIG-TABLE具有相同的结构,但有一个区别 - table-clone没有索引。
2)当您从设备接收数据时,请将其放入表克隆。
3)写一些机器人代理,每小时或每天将小表中的记录放入大表 - 这取决于你,但最好的情况是选择这样的间隔,表的大小足以做全扫描(记住,它没有索引)。4)当你想要执行SELECT查询时,你可以在2个表中完成 - 在索引的BIG表中 - 足够快,因为没有人试图将数据插入其中(有时只有机器人执行),而小表中的fullscan也是如此足够快,因为你可以保持小。
5)机器人应该在平静的时间醒来,可能是在晚上。