1000张表还是多个MySQL实例?

6
我继承了一个公司的应用程序,每个“对象”使用58个表,并且该应用程序可以有N个对象。我们正在考虑安装75-100个应用程序对象,这将涉及4300-5000个表。
我们正在努力确定是否要使用一个数据库并为每个对象的表名添加前缀,还是为每个对象使用一个数据库(应用程序支持两种方式)。唯一的区别是,对于每个应用程序的安装,如果我们使用每个数据库,则需要在不同端口上添加更多的mysql实例。
有人做过类似的事情吗?除了管理之外,拥有4000多个表会有什么问题?
编辑
感谢更新。关于一些评论:
1)公司支付得很好...我不傻,不接受这份工作。我希望只写出优秀的代码就能让钱进入我的银行账户。
2)我们的客户对产品感到满意。我们曾考虑重新编写它,但除了成本之外,我们会错过市场。尽管结构不好,但该应用程序比大多数客户拥有的应用程序都要好。
3)对象不是最好的术语...它不像对象/类那样,而是指应用程序内部的对象。我想我只能说bucket代替object。

一篇很好的文章讨论了你所问的同样问题: http://bit.ly/5Zs9aC - James Goodwin
你可以在一个数据库中有很多表,但特定的产品有特定的限制。对于MySQL,请参阅这篇优秀的文章:http://www.askbjoernhansen.com/2008/02/14/10000_tables_in_one_mysql_database.html你的前任是否可能创建了很多表作为分区的形式?是一种像单个客户分散在多个表中(垂直,列分布)的单个对象,还是整个客户集合分成多个表(水平,行分布)的情况更多? - Roland Bouman
3
虽然我无法提供答案,但我可以表达我的同情! - Mike Robinson
6个回答

2
如果您重复使用58个表格一百次,我建议规范化规则已经被忽视了。根据您提供的信息,我建议公司重新审查此产品的模式设计,但这不太可能发生。
不要通过分发数据库使情况变得更糟。延迟如何帮助?

2

MySQL将每个表存储为文件,除了您的操作系统和硬盘外没有限制。然而,很少讨论的原因是,拥有数千张表几乎肯定是错误的做法,您的数据库模式可能急需重新设计。


将每个表作为文件存储:实际上并不是这样的,例如InnoDB会将所有数据存储在单个文件中,除非设置了特定选项。 - shylent

2

有趣的是,我曾经见过这种类型的应用程序,我能告诉你最好的做法是重新编写该应用程序。在重新设计以不涉及每个对象58个表之前,请停止销售该应用程序。


1
我曾经为一家公司工作,实现了类似于你所说的东西。我们使用了一个叫做RAMCO的产品,它可以以任何一种方式实现,而我们选择将所有表格放在一个单独的数据库中。我们之所以选择这种方法,是因为有多个原因(包括更容易的管理、备份、复制和集群)。有趣的是,虽然你有这样一个不连贯的数据模型,但你实际上放入其中的数据量并不比你放入其他模型中的数据量多。因此,我们的备份大约是12GB未压缩的。至于引擎,它可以很好地处理那么多的表格。
话虽如此,我同意到目前为止每一个回答的观点,即你的公司肯定应该重新考虑他们的数据架构(或者如果我是你,我会重新考虑是否真的想为这样一个实现这种东西的公司工作)。在我的情况下,公司拒绝放弃这个产品,所以我找到了其他的工作。

0
很难在不看到实际架构的情况下判断(为什么一个对象需要58个表),但如果您将来需要连接这些表,您需要将它们保持在单个数据库中。
在一个数据库中拥有许多MyISAM表,并同时使用它们,意味着需要具备大量的table_cache

0

只要您能保证表的数量不会无限增加,拥有相当大数量的表就不是问题。

真正的问题在于表缓存(应该比总表数更大,除非您想要性能变差)以及引擎和操作系统的限制。

我们经常在每个服务器上使用2000多个MyISAM表,如果您已经调整和测试过它以适应那个数量,那么就没有具体的问题。

确保您使用预期数量的表进行性能测试。打开表可能很昂贵,因此请确保您不会做得比必要更多。

一些引擎(如MyISAM)将在关闭表时丢弃一些缓存数据(仅键块),如果您定期关闭它们,则这非常糟糕。

根据选项,您的引擎可能需要每个打开的表一个或多个文件描述符。通常(在Linux上),mysql应该使用ulimit正确地调整最大数量,但在某些情况下可能不会。

在某些时候,您可能会遇到操作系统范围内的限制(默认情况下,在某些Linux版本上为32k),并且必须使用sysctl或其他调整来增加它。


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