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

12
因为我的MySQL表使用InnoDB存储引擎,可能会包含多十亿行数据(潜在没有插入数量限制)。你能告诉我如何优化以加快速度吗?因为即使只有几百万行,速度也会变慢。如果您建议使用其他东西,那么我唯一的选择是PostgreSQL和Sqlite3。但是我被告知sqlite3不适合这种情况。至于postgresql,我完全不知道它是什么,因为我从未使用过。我想象至少需要每秒在该表中进行1000-1500个插入操作。

这可能会引起您的兴趣:https://dev59.com/L3E85IYBdhLWcg3wZyqt - Daniel Frear
你不能归档数据吗?确切的用例是什么? - programmersbook
4个回答

6
简单回答您的问题,是的InnoDB是处理亿万行数据集的完美选择。
有许多优化方法可用。
最明显的优化是设置一个大的缓冲池,因为缓冲池是InnoDB最重要的事情,InnoDB会在缓冲池中缓存数据和索引。如果您有一个专用的MySQL服务器,只有InnoDB表,则应将可用RAM的高达80%设置为由InnoDB使用。
另一个最重要的优化是在表上拥有适当的索引(记住数据访问/更新模式),包括主键和次要索引。(请记住,主索引会自动添加到次要索引中)。
使用InnoDB还有一些额外的好处,例如保护数据免受损坏,自动恢复等。
至于增加写入性能,您应该将事务日志文件设置为总共4G。
您还可以将表分区以提高性能。
通过将bin-log-format设置为“row”并将auto_inc_lock_mode设置为2(这将确保innodb在插入自增列时不会持有表级锁),可以获得更多的性能。
如果您需要任何具体建议,请联系我,我很乐意帮助您。

2

优化

  • 注意不要有太多的索引。插入时它们是很昂贵的。
  • 让你的数据类型紧密地适应你的数据。(所以如果你知道我的意思,不要将ip地址保存在文本或blob中)。查看varchar与char。不要忘记,因为varchar更加灵活,你正在交换一些东西。如果你对你的数据了解得很多,使用char可能会有帮助,或者使用varchars肯定更好等。
  • 你是否从这个表中读取任何信息?如果是,你可能想要从一个复制的从服务器中进行所有的读取,虽然你的连接应该足够好处理那么多的数据。
  • 如果你有大量的插入(除了插入数量之外),确保你的IO实际上足够快来处理负载。
  • 我认为MySQL没有任何理由不支持这个。可以使你从"千"到"百万"到"十亿"变慢的东西是像前面提到的索引之类的东西。就我所知,没有"mysql已满"的问题。
  • 研究部分索引。从维基百科(最快速的来源)了解(我没有检查参考文献,但我相信你可以处理:)

MySQL 5.4版本及以上不支持部分索引。[3] 在MySQL中,"部分索引"这个术语有时用于指前缀索引,其中仅存储每个值的截断前缀。这是另一种减小索引大小的技术。[4]


当我们特别谈论InnoDB时,拥有太多的二级索引在插入时并不昂贵,因为InnoDB使用了插入缓冲区。 - ovais.tariq
我不是InnoDB插入缓冲和二级索引方法的专家,但即使有一些特殊的系统在运作,索引仍然需要被构建。无论如何,这都需要时间。 - Nanne

1

关于MySQL/InnoDB部分我不太清楚(我认为它应该能应对)。但如果你最终考虑其他选择,PostgreSQL在理论上可以管理无限大小的数据库。(根据FAQ,至少存在一个32TB的数据库according to the FAQ。)

你能告诉我有哪些优化措施可以帮助加快速度吗?

你的应用程序会因情况而异。但是对于数十亿行数据,你至少需要考虑将数据进行分区,以便在较小的表上工作。

在PostgreSQL的情况下,你还需要根据需要创建部分索引。


-1

1
所有的观点都很好,而且仍然有效。但请注意,自2006年以来,InnoDB的性能已经得到了极大的改善。 - Mchl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接