0

我们有一个产品为不同的客户使用不同的 MySQL shemas,还有一个 Java 应用程序为每个客户使用不同的持久性单元。这使得在不重新部署应用程序的情况下添加客户变得很困难。

我们计划使用单个 MySQL 数据库模式来保存所有客户,每个表都有一个字段,该字段是一个 KEY sibolizing 一个客户,因此添加一个新客户只需很少的 sql 更新/插入。

在 MySQL 中处理此类数据的最佳方法是什么……MySQL 是否通过键或类似的方式提供任何分区表。这种方法的性能问题可能是什么?

4

1 回答 1

1

这里有几个问题:

架构设计问题

分区问题

mySQL 可以处理 HASH MAP 查询 O(1)

架构设计问题: 是的,这比为每个客户启动一个新应用程序要好得多。

mySQL 是否可以处理 HASH MAP 查询 O(1) 是的,如果数据保留在内存中并且有足够的 CPU 周期,mySQL 可以轻松地每秒执行 300K 次选择。否则,如果数据是 I/O 受限且磁盘子系统未饱和,则 mySQL 每秒可以轻松执行 20-30K 次选择,具体取决于流量模式、并发性以及数据库磁盘子系统可以执行的 IOPS 多少。

分区 在谈论 mySQL 的上下文中,分区意味着不同的东西。分区是一种存储引擎,它位于 mySQL 中的另一个存储引擎之上,用于将数据分配给某个表,但将一组分区表作为单个表公开给调用应用程序。分区也可能意味着让某些数据库执行所有表的子集。在您的上下文中,我认为您是在询问您是否按客户联合对性能有什么影响。即,如果需要,您可以使用相同的模式为每个客户分配一个数据库。这个概念更符合分片的理想,将数据作为一个整体,并为每个数据单元(例如客户)分配资源。

我对您的建议 使每个客户的架构相同。对客户将执行的所有查询进行基准测试。查询模式就是这样。验证使用 EXPLAIN 的每个查询都不会生成文件排序或临时表,也不会一次扫描 100K 行,并且您应该能够毫无问题地进行扩展。一旦您遇到一个或一组盒子接近您的 IOP 上限的问题,请考虑拆分数据。

于 2013-03-18T20:39:46.107 回答