我目前在MYSQL数据库中有26个表。每当我们有一个新客户端时,我的老板都希望我重新创建这26个表,并将某种客户端缩写添加到这些新表中。例如,有company1~system~用户和company2~system~用户等等。
我宁愿只是在数据库中添加一个表来跟踪我们的客户端,使用一个自动递增的11位INT主键,而在其他26个表中引用它,所以我们不会使数据库混乱。如果有200个客户,则有4000个表。
我认为他担心的是,如果我们采用我宁愿做的方法,MYSQL会花费更长的时间来执行查询,因为每个具有2000到5000条记录的客户端将共享表。因此,例如,从名为system~具有1,500,000条记录的用户的表中搜索属于company1的用户将比从名为company1~system的用户的表中搜索具有2,000条记录的用户慢。我认为如果我们拥有的每个客户端有26组表(每个客户端26个),MYSQL实际上会慢一些。
哪种方法实际上更慢?
答案 0 :(得分:4)
为什么不创建数据库或每个公司?然后,在构造查询时甚至不需要构造动态表名。这是一个更健全的解决方案。更重要的是,它会使客户端数据更加分离,因此任何相互依赖性都可能更加明显。
当应用程序层也是独立的时,上述工作最佳,因此您可以为每个实例提供一组不同的数据库登录凭据。
如果情况并非如此,它可能会正常工作或笨拙或罚款,具体取决于您的安装,您正在使用的平台等等。
附加公司名称是一种黑客攻击,但我认为它可以工作。
在记录中拥有客户端ID也是一种常见方法。只要表格被适当编入索引,从性能的角度来看,我不一定会担心150万条记录。这不是一个庞大的记录。此外,公司ID标准无论如何都应该很好地限制结果。
答案 1 :(得分:1)
200个客户*根据数据库标准,[在任何给定表中] 5,000条记录很小。 如果您将client-id添加为大多数索引的第一个键,那么您建议的方案不应引入任何明显的性能下降。
但是,出于其他原因保留客户数据可能会很有趣。也许如果这对应用程序有意义,您可以在单独的数据库中处理每个不同客户端的数据。
答案 2 :(得分:0)
如果您对公司标识符有适当的索引,那么性能应该不是问题。
至于在表名中附加id,为什么不考虑创建单独的数据库实例呢?我认为更改表名可能需要额外的编码(在任何查询中动态生成表名),使用不同的实例似乎很简单。
答案 3 :(得分:0)
将所有客户的数据保存在同一组表中,直到您有充分的理由这样做。
根据我从上面的理解,你的数据非常小,因此适合于ram;这使得在实践中不需要进行性能调整,因此您不会关心索引聚类等事情。
做最简单的事情。只需将它们保存在一组表格中即可。
答案 4 :(得分:0)
谢谢大家的精彩和有益的建议。根据您的普遍共识,似乎我应该将每个客户端表组分成他们自己的数据库,或者允许客户端在一组表中与具有公司标识符的适当索引共享其信息。
答案 5 :(得分:0)
你的解决方案听起来最好,就性能而言,硬件便宜。尝试维护4000个表或26个数据库,可能比具有更多RAM的更好CPU的一次性成本更高。听起来你的老板正试图为你做工程,这没有用。