注意:我在这里搜索过其他类似的Q,并且其他任何一个回答的问题都没有甚至是相似的。有了......
我有一个关于MySql表的问题(更准确地说,是关于表中的特定字段 - 即tweets
或updates
)。
所以问题是... InnoDB表上的最大行数是多少?也就是说,如果MyIsam,InnoDB和其他人可以持有的金额之间存在很大差异,那么一般来说,如果没有。 其次,如果表格变得非常大,那么存储数据的最佳实践是什么(相同的一个表格,或者分割/多个表格/ dbs)?
我读到Twitter每天都有1亿条推文。在同样的背景下,我的第二个问题将如何适用于像twitter这样的东西?
答案 0 :(得分:19)
没有行限制,但InnoDB数据库上有size limit:
最小表空间大小为10MB。 最大表空间大小为四 十亿个数据库页面(64TB)。这是 也是表格的最大尺寸。
您可以通过在多个文件中将行存储在同一个表的多个分区中来始终horizontally partition。
答案 1 :(得分:14)
http://dev.mysql.com/doc/refman/5.5/en/innodb-restrictions.html将允许您根据密钥大小计算限制。
但我谦卑地建议您不要在具有参照完整性和InnoDB的其他功能的事务引擎中存储推文之类的信息,并且您肯定不会将它们全部存储在一个表中在单个数据库实例中。您将它们放入许多独立的非SQL数据库中,这些数据库允许您快速追加,然后将元信息(如主题标签,RT等)提取到更复杂的数据库中。关于Twitter数据库架构的演示很容易谷歌(例如http://www.slideshare.net/nkallen/q-con-3770885)。
如果您必须在一个表中存储大量数据,则分区是您的朋友,并且Postgres可能会更好地支持它。分区表实际上是几个逻辑上看起来像一个表的表。您将这些子表(分区)放在不同的磁盘上,独立地对它们进行维护等。此外,“星型模式”包含一个非常长的表,其中只包含必要的列和许多存储较大但可选列的表帮助
答案 2 :(得分:2)
表的64TB限制有以下例外:
innodb_page_size = 16K
(默认值)。可以设置为4K和64K之间的2的幂,按比例更改表空间限制。PARTITIONed
表基本上是一堆子表'组织在一起,充当一张大桌子。分区数量的5.6.7之前的限制是1024.之后,它已经是8192.所以将64TB乘以它。好的,这只会给你一个字节限制。此外,它还包括开销和索引。然后,您需要除以平均记录的大小来获得最大行数。
(计算平均记录大小并不容易。)
简单回答:
你可能很容易得到1万亿"小" InnoDB表中的记录。通过一些努力,你可能会达到1000万亿。但我怀疑你之前的磁盘驱动器预算会耗尽。此外,需要花费数年才能完成所有INSERTs
来填补它!
所以,现实的答案:MySQL可以处理无限制的'行数。
现实生活?我听说有几张表超过10亿行,甚至多达150亿行。
请参阅我的Limits,但它没有更多关于行的问题。