请给出一些关于MySQL索引的建议,有以下要求吗?

请给出一些关于MySQL索引的建议,有以下要求吗?,mysql,bigdata,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分钟生成10亿行 因为数据太多

我正在考虑使用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分钟生成10亿行

因为数据太多了。我想把数据分成多台机器和多个表(一个表可能只有一个接口)。我只打算保留最近7天的数据

但这张桌子仍然可能非常大,而且增长非常快

当我查询数据时,我希望结果可以在几秒钟内返回。所以我想我必须创建索引。但是我可能会查询很多列,所以索引必须覆盖很多列

现在的问题是,我必须在一个大表上创建一个大索引(覆盖很多列),这个表的增长速度也非常快。这是个好主意吗


或者你有比mysql更好的建议吗?

你应该在复合索引中拥有尽可能少的列。这应该涵盖您的所有主要查询。因此,请查看选择中所需的列

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

基本上,如果可能的话,我建议您预先聚合数据。执行所有插入的逻辑可以将数据传递给另一个逻辑


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

您应该在复合索引中拥有尽可能少的列。这应该涵盖您的所有主要查询。因此,请查看选择中所需的列

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

基本上,如果可能的话,我建议您预先聚合数据。执行所有插入的逻辑可以将数据传递给另一个逻辑


您可能只应该使用MySQL来持久化数据并在内存中处理查询。例如,使用您喜欢的编程语言或memcached之类的缓存。

您想
每秒插入300万行吗?不可能!至少不是在一台机器上。也许你可以把它分到10台机器上

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

设计索引的唯一方法是知道
选择的是什么让我们看看。

不要再给你的项目泼冷水了。这里有一个可能实现你目标的方法

选项
可能是统计信息或其他类型的摘要信息。因此,根本不存储数据。取而代之的是,在收到数据时对其进行汇总。例如,取10K行,将其汇总到200行,然后将这些行插入汇总表中。即便如此,这也将是一个挑战(以每分钟100万行的速度)


所以。。。让我们从输出开始(
选择
)并向后操作。

是否希望
每秒插入300万行?不可能!至少不是在一台机器上。也许你可以把它分到10台机器上

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

设计索引的唯一方法是知道
选择的是什么让我们看看。

不要再给你的项目泼冷水了。这里有一个可能实现你目标的方法

选项
可能是统计信息或其他类型的摘要信息。因此,根本不存储数据。取而代之的是,在收到数据时对其进行汇总。例如,取10K行,将其汇总到200行,然后将这些行插入汇总表中。即便如此,这也将是一个挑战(以每分钟100万行的速度)

所以。。。让我们从输出开始(
选择
)并向后操作。

更不用说存储7天数据所需的PB级存储空间了。更不用说存储7天数据所需的PB级存储空间了。