2013-03-12 85 views
0

目前,我有一张桌子,它的填充速度非常快。 我有50个设备。我每隔30秒从每台设备收集数据。因此,在添加10,000个设备之后,他们每个月会产生8.76亿条记录 - 这是很多!数据库设计 - 如何构造

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

单位=设备,对吧?我不会建议为每个设备创建一个单独的表。您的索引是否可以解决您必须运行的查询? – Melanie 2013-03-12 16:29:15

+0

长时间运行的查询是什么样的? – 2013-03-12 17:04:59

+0

Darius,我目前也试图修复查询:http://stackoverflow.com/questions/15367719 – Andrew 2013-03-12 17:19:45

回答

0

创建新表是一个不错的主意,但您不需要实现它,MySql已经有了关于“mysql +分区”关键字的工具 - 谷歌。我建议使用它,因为你不需要改变你的查询,mysql本身就关心它。只需将“partition by”关键字添加到您创建的表格中即可。

对你来说还有一个窍门:我建议你将大量信息收集到一些大表中,并且有时还要从中选择一些数据。但插入许多新行会引发表被锁定(不可用于选择)和重建索引(我确信您的表已编入索引)。在我目前的项目中,我正在做类似于你的事情,我建议你做以下事情:

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

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

3)写一些机器人代理,它会将小表中的记录每小时或每天都放入大表中 - 这取决于您,但最好的情况是选择表格大小足以进行全屏扫描的间隔(请记住,它没有编入索引)。 4)当你想要执行SELECT查询时,你需要在2个表格中执行 - 在索引BIG表格中 - 足够快,因为没有人试图插入数据(有时只有机器人会这样做),而fullscan在小表格中 - 也足够快,因为你可以保持它很小。

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

+0

我已经有一个表格显示最新记录,而这张大表格用于报告。所以当我运行我的报告时,我的服务器在cpu中达到100%所有客户端都遭受了30秒的困扰 – Andrew 2013-03-17 18:25:46

+0

您的意思是报告时间与从小表到大表插入新鲜最新记录相吻合?因为这种情况似乎是唯一的不好的情况。可能是你应该存储大表的2副本 - BT1,BT2;将最新记录写入BT1每个“some_interval”小时,删除prev BT2并将其替换为BT1的新副本。运行BT2报告。这种结构可以保证您的报告(选择)/填充(插入)查询不会相交。 – Baurzhan 2013-03-18 02:55:54