【问题标题】:Is InnoDB (MySQL 5.5.8) the right choice for multi-billion rows?InnoDB (MySQL 5.5.8) 是数十亿行的正确选择吗?
【发布时间】:2011-09-01 14:08:43
【问题描述】:

因此,我在 MySQL 中使用 InnoDB 存储引擎的一张表将包含数十亿行(可能对插入的行数没有限制)。

你能告诉我我可以做哪些优化来帮助加快速度吗? 因为已经有几百万行,它会开始变慢。

当然,如果您建议使用其他东西。我唯一的选择是 PostgreSQL 和 Sqlite3。但有人告诉我 sqlite3 不是一个好的选择。 至于postgresql,我完全不知道它是怎么回事,因为我从来没有用过。

但我想,该表中至少每秒插入大约 1000-1500 次。

【问题讨论】:

标签: mysql storage


【解决方案1】:

对您的问题的简单回答是肯定的,InnoDB 将是数十亿行数据集的完美选择。

有很多优化是可能的。

最明显的优化是设置一个大的缓冲池,因为缓冲池是 InnoDB 最重要的事情,因为 InnoDB 缓冲缓冲池中的数据和索引。如果您有一个只有 InnoDB 表的专用 MySQL 服务器,那么您应该设置最多 80% 的可用 RAM 供 InnoDB 使用。

另一个最重要的优化是在表上设置适当的索引(记住数据访问/更新模式),包括主索引和辅助索引。 (请记住,主索引会自动附加到二级索引)。

InnoDB 有一些额外的好处,例如防止数据损坏、自动恢复等。

至于提高写入性能,您应该将事务日志文件设置为最大 4G。

您可以做的另一件事是对表进行分区。

您可以通过将 bin-log-format 设置为“row”并将 auto_inc_lock_mode 设置为 2 来获得更高的性能(这将确保 innodb 在插入自动增量列时不会持有表级锁)。

如果您需要任何具体建议,可以联系我,我非常愿意提供帮助。

【讨论】:

    【解决方案2】:

    优化

    • 注意不要有太多索引。插入时它们很昂贵
    • 使您的数据类型尽可能地适合您的数据。 (因此,如果您知道我的意思,请不要将 IP 地址保存在文本或 blob 中)。查看 varchar 与 char。不要忘记,因为 varchar 更灵活,所以你在交易一些东西。如果您对数据了解很多,则使用 char 可能会有所帮助,或者使用 varchar 可能会更好。等
    • 您是否阅读过此表?如果是这样,您可能希望从复制的从属设备中进行所有读取,尽管您的连接应该足以容纳该数据量。
    • 如果您有较大的插入(除了插入的数量),请确保您的 IO 实际上足够快以处理负载。
    • 我认为 MySQL 没有任何理由不支持这一点。可以使您从“数千”到“数百万”再到“数十亿”减速的事情就是上述索引之类的东西。有 - 据我所知 - 没有“mysql 已满”的问题。
    • 查看部分索引。 From wikipedia(我能找到的最快的来源,没有检查参考资料,但我相信你可以管理:)

    从 5.4 版开始的 MySQL 没有 支持部分索引。[3]在 MySQL 中, 术语“部分索引”有时是 用于引用前缀索引,其中 只有每个值的截断前缀 存储在索引中。这是 另一种减少索引的技术 大小。[4]

    【讨论】:

    • 当我们特别提到 InnoDB 有太多二级索引时,插入时并不昂贵,因为 InnoDB 是如何使用插入缓冲区的。
    • 我不是 InnoDB 的插入缓冲和二级索引方法方面的专家,但是虽然有一些特殊的系统到位,但索引仍然需要构建。这需要时间。
    【解决方案3】:

    不知道 MySQL/InnoDB 部分(我认为它会应付)。但是,如果您最终寻找替代方案,PostgreSQL 可以在纸上管理无限大小的数据库。 (至少存在一个 32TB 数据库according to the FAQ。)

    你能告诉我我可以做哪些优化来帮助加快速度吗?

    您的里程数会因您的应用而异。但是对于数十亿行,您至少要考虑对数据进行分区,以便处理较小的表。

    对于 PostgreSQL,您还需要考虑在适当的情况下创建部分索引。

    【讨论】:

      【解决方案4】:

      你可能想看看:

      http://www.mysqlperformanceblog.com/2006/06/09/why-mysql-could-be-slow-with-large-tables/

      http://forums.whirlpool.net.au/archive/954126

      如果您有一个非常大的表(数十亿条记录)并且需要对表进行数据挖掘(读取大量数据的查询),mysql 可能会慢到爬行。 大型数据库 (200+GB) 很好,但在尝试读取无法放入内存的大型组时,它们会受到 IO/临时表与磁盘的绑定以及其他多个问题。

      【讨论】:

      • 所有优点,仍然有效。但请注意,自 2006 年以来,InnoDB 的性能有了显着提高。
      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2010-10-22
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多