创建巨大 SQL table 的最佳实践

Best practices for creating a huge SQL table

我想为 50 个州中的每个州创建一个关于 "users" 的 table。每个州都有大约 2GB 的数据。哪个选项听起来更好?

  1. 创建一个名为 "users" 的 table,大小为 100GB 或者
  2. 创建 50 个名为 "users_{state}" 的独立 table,每个大小为 2GB

我关注两件事:性能和风格(最佳实践)

我也是 运行 AWS 上的 RDS,我有足够的存储空间 space。有什么想法吗?

编辑:从外观上看,我不需要同时来自多个州的信息(即,如果我选择选项 2,则不需要经常加入 tables)。这是一个常见的用例:前端将状态id传递给后端,根据该id,我需要从数据库中查询指定状态的数据,并将return数据返回到前端-结尾。

  • 这50个状态在你的业务逻辑上真的是独立的吗?这意味着您的查询在大多数情况下只需要 运行 超过一个给定状态?如果是这样,按状态拆分可能是一个不错的选择。在这种情况下,您只需要加入相对较少的查询,例如报告查询等。

编辑: 根据您最近的编辑,第一个选项是我推荐的路线。当不需要连接时,您将从 table 分区中获得更好的性能,并且像这样使用较小的分区 tables 还有很多其他好处。

  • 如果您的查询通常需要连接大多数州,那么您绝对不应该这样划分。您最好使用一个大的 table 并构建性能所需的适当索引。大多数现代企业数据库解决方案都能够很好地处理从 2GB 到 100GB 的边际性能影响(使用适当的索引)。

  • 但如果您的查询平均只需要连接来自少数几个州(比如不超过 5-10 个左右)的结果,则最佳解决方案是一个更复杂的灰色区域。您可能能够通过连接从分区的 table 中提取更好的性能,但它可能会使代码 and/or 查询(以及所有即将进行的维护)明显更加复杂。

请注意,我的回答假设了更常见的访问频率细分:高读取、中等更新、低 creates/deletes。此外,如果大数据的性能是您最关心的问题,您可能想要检查 NoSQL(例如,Amazon AWS DynamoDB),但这将是对关系系统的侵入性和根本性的背离。但是 NoSQL 的性能优势绝对是巨大的。

如果不了解您的模型,任何人都很难对性能等做出判断。但是,从数据建模的角度来看,在考虑规范化模型时,我希望看到用户table 带有一个列(或多个列,在复合键的情况下),其中包含状态 table 的外键。如果一个 User 可以与多个状态相关联,我希望创建另一个 table (UserState),这将保存 User 和 State 的外键,以及关于该关系的任何其他信息(例如,时间切片的开始和结束日期,显示用户和状态关联的时间跨度。

与其将数据拆分为单独的 table,如果您发现存在性能问题,您可以使用分区按状态拆分用户数据,同时将其保留在单个 table 中。我不使用 MySQL,但快速 Google 找到了大量关于如何在 MySQL.

内实现分区的参考信息

在您尝试构建和 运行 之前,我认为您不知道自己是否存在性能问题。如果你这样做,按照上面的设计,你可以在事后应用分区,而不需要改变你的前端查询。此外,如果事实证明您 do 同时需要多个州的信息,那么此解决方案不会有问题,并且如果您需要的话,不会给您带来太多的悲伤从 State 以外的其他方面来看 User。