【问题标题】:Can give some advice on MySQL index with below requirements please?请给以下要求的MySQL索引一些建议吗?
【发布时间】:2017-09-22 08:24:03
【问题描述】:

我正在考虑使用 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 bigdata


    【解决方案1】:

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

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

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

    对你的项目泼冷水就够了。这是实现目标的可能方法...

    SELECTs 可能是统计信息或其他类型的摘要信息。所以,根本不要存储数据。取而代之的是,总结进来的数据。假设 10K 行,将它们汇总到 200 行,然后将 INSERT 这些行汇总到汇总表中。即使这样也将具有挑战性(1M 行/分钟)。

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

    【讨论】:

    • 更不用说存储 7 天数据所需的 PB 存储空间了。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多