InnoDB(MySQL 5.5.8)是数十亿行的正确选择吗?

时间:2011-05-25 08:59:10

标签: mysql storage

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

你能告诉我我能做些什么样的优化来帮助加快速度吗? 因为已有几百万行,它将开始变慢。

当然,如果你建议使用别的东西。我唯一的选择是PostgreSQL和Sqlite3。但我被告知sqlite3不是一个好选择。 至于postgresql,我完全不知道它是怎么回事,因为我从未使用它。

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

4 个答案:

答案 0 :(得分:6)

对你的问题的简单回答是肯定的,InnoDB将是数十亿行数据集的最佳选择。

有许多可能的优化。

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

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

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

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

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

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

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

答案 1 :(得分:2)

优化

  • 注意不要有太多索引。插入时价格昂贵
  • 使您的数据类型适合您的数据,尽可能紧密。 (所以如果你知道我的意思,不要在文本或blob中保存ip-adresses)。查看varchar vs char。不要忘记,因为varchar更灵活,你在交易一些东西。如果您对数据了解很多,那么使用char可能会有所帮助,或者使用varchars可能会更好。等
  • 你从这张桌子上读过吗?如果是这样,您可能希望从复制的从站执行所有读取操作,尽管您的连接应该足以满足该数据量。
  • 如果您有大插入(除了插入数量),请确保您的IO实际上足够快以处理负载。
  • 我认为没有任何理由MySQL不会支持这一点。可以让你从“数千”减慢到“数百万”到“数十亿”的事情就像前面提到的索引一样。据我所知 - 没有“mysql已满”的问题。
  • 查看部分索引。 From wikipedia(我找到的最快的来源,没有检查参考文献,但我相信你可以管理:)
  

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

答案 2 :(得分:1)

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

  

你能告诉我我可以做些什么样的优化来帮助加快速度?

您的milage将根据您的申请而有所不同。但是对于数十亿行,您至少需要分析数据,以便处理较小的表。

对于PostgreSQL,您还将考虑在适当的时候创建部分索引。

答案 3 :(得分:-1)

您可能需要查看:

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 / temp表绑定到磁盘以及其他多个问题。