我正在考虑使用MySQL来解决以下需求。在这里,让我先说明一下我的需求。
我有一些网络数据如下:
timestamp
router_ip
interface_id
src_ip
dst_ip
src_port
dst_port
src_mac
dst_mac
vlan
vxlan
protocol
cost
direction
size
我已经省略了一些列。所以我试图创建一个包含大量列的表(比我列出的更多。可能是20列?)
此外,数据量非常大。例如,该设备每5分钟产生十亿行。
因为数据太多了。我想把数据拆分成多台机器还有多个表(可能是一个表的一个接口)。我只打算保留最近7天的数据。
但桌子仍然非常大而且增长速度非常快。
当我查询数据时,我希望结果可以在几秒钟内返回。所以我想我必须创建索引。但我可能会查询很多列,因此索引必须覆盖很多列。
现在的问题是我必须在一张大桌子上创建一个大型索引(覆盖很多列),这个索引的增长也非常快。这是个好主意吗?
或者你有比mysql更好的建议吗?
答案 0 :(得分:2)
你想每秒INSERT
300万行?没门!至少不在一台机器上。 也许你可以将它分成10台机器。
索引,除了AUTO_INCREMENT
或时间戳之外,将是一场灾难。这是因为,一旦索引太大而无法缓存,更新索引会将处理速度降低到磁盘速度。即使使用SSD,您也无法获得每秒近百万次索引更新。
设计索引的唯一方法是知道SELECTs
将是什么。 - 让我们看看他们。
足够在你的项目上泼冷水。这是实现目标的可能的方式......
SELECTs
可能是统计信息或其他类型的摘要信息。所以,根本不要存储数据。相反,汇总中的数据。比如说,10K行,将它们汇总到200行,然后INSERT
将这些行汇总到汇总表中。即使这样也很有挑战性(每分钟1M行)。
所以......让我们从输出(SELECTs
)开始,然后向后工作。
答案 1 :(得分:0)
你应该尽可能地在复合索引中使用少量列。这应涵盖所有主要查询。因此,请查看SELECT中需要的列。
您还可以考虑主从设置,而主设备不使用任何索引(加速插入),只有从设备将具有所有索引。但这可能会导致延迟。
基本上我建议你尽可能预先汇总数据。执行所有INSERT的逻辑可以将数据传递给另一个逻辑。
您可能应该仅使用MySQL来保存数据并处理内存中的查询。例如。在您喜欢的编程语言或某些缓存中,如memcached。