我们有一个产品,它为不同的客户使用不同的MySQL shemas,以及为每个客户使用不同的持久性单元的单个Java应用程序。这使得在重新部署应用程序时添加一个cutomer很困难。
我们计划使用单个MySQL数据库模式,该模式可以容纳所有客户,每个表都有一个字段,这个字段是一个客户的关键字,因此添加新客户只是少量sql更新/插入。
在MySQL中处理这类数据的最佳方法是什么?MySQL是否通过密钥或类似方式提供任何分区表。那个方法的性能问题可能是什么?
答案 0 :(得分:1)
这里有几个问题:
架构设计问题
分区问题
mySQL可以处理HASH MAP查询O(1)
架构设计问题: 是的,这比每位客户推出一款新应用程序要好得多。
mySQL可以处理HASH MAP查询O(1) 是的,如果数据保留在内存中且有足够的CPU周期,mySQL可以很容易地做300K选择一秒钟。否则,如果数据受I / O限制且磁盘子系统未饱和,则mySQL可以轻松地每秒执行20-30K次选择,具体取决于流量模式,并发性以及数据库磁盘子系统可以执行的IOPS数量。
<强>分区强> 在讨论mySQL时,分区意味着不同的东西。分区是一个存储引擎,它位于mySQL中的另一个存储引擎之上,用于将数据分配给某个表,但将一组分区表作为单个表暴露给调用应用程序。分区还可能意味着让某些数据库执行所有表的子集。在您的上下文中,我认为您在询问是否按客户联合对性能产生的影响。即如果需要,您可以使用相同的架构为每个客户分配数据库吗?这个概念更符合Sharding的理想,将数据作为一个整体并分配每单位数据的资源,例如:顾客。
我的建议 使每个客户的架构相同。对客户所涉及的所有查询进行基准测试。查询模式即。验证具有EXPLAIN的每个查询不会生成文件或临时表,也不能一次扫描100K行,您应该能够扩展没有问题。一旦你遇到一个或一组接近你的问题,IOP上限会考虑分割数据。