请问有关以下要求的MySQL索引的建议吗?

时间:2016-01-18 07:43:16

标签: mysql bigdata

我正在考虑使用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更好的建议吗?

2 个答案:

答案 0 :(得分:2)

你想每秒INSERT 300万行?没门!至少不在一台机器上。 也许你可以将它分成10台机器。

索引,除了AUTO_INCREMENT或时间戳之外,将是一场灾难。这是因为,一旦索引太大而无法缓存,更新索引会将处理速度降低到磁盘速度。即使使用SSD,您也无法获得每秒近百万次索引更新。

设计索引的唯一方法是知道SELECTs将是什么。 - 让我们看看他们。

足够在你的项目上泼冷水。这是实现目标的可能的方式......

SELECTs可能是统计信息或其他类型的摘要信息。所以,根本不要存储数据。相反,汇总中的数据。比如说,10K行,将它们汇总到200行,然后INSERT将这些行汇总到汇总表中。即使这样也很有挑战性(每分钟1M行)。

所以......让我们从输出(SELECTs)开始,然后向后工作。

答案 1 :(得分:0)

你应该尽可能地在复合索引中使用少量列。这应涵盖所有主要查询。因此,请查看SELECT中需要的列。

您还可以考虑主从设置,而主设备不使用任何索引(加速插入),只有从设备将具有所有索引。但这可能会导致延迟。

基本上我建议你尽可能预先汇总数据。执行所有INSERT的逻辑可以将数据传递给另一个逻辑。

您可能应该仅使用MySQL来保存数据并处理内存中的查询。例如。在您喜欢的编程语言或某些缓存中,如memcached。