当我有一个庞大的复杂关系数据库,而这个数据库太大而无法放在一台机器上时,我会使用什么而不是SQL连接?我已经开始在许多机器上对数据库进行分片,但结果是,我无法再有效地进行连接。
任何提示?
答案 0 :(得分:8)
有许多方法可以完成这项工作,一般的想法是以对相关数据进行分组的方式对数据进行分片。
作为一个简单(简单)的例子,如果你有一个游戏数据库,你可以用相同的键(playerId)分割Player和PlayerGame数据。如果还有其他相关的表,您也可以添加它们,将其视为相关表的“分片树”。然后,保证给定播放器的所有数据都在同一个分片中。然后,您可以在分片中执行联接,但不能跨分片执行内部联接。
另一种常见技术是将全局表复制到所有分片,这些分片通常是不经常更新的表,但在很多连接中使用。
通过以下两种方法,您可以:
然后另一个技巧是分布式查询,您可能需要汇总多个分片的结果(例如,所有玩家的数量)。
这是一份白皮书,更详细地描述了很多内容:
http://dbshards.com/dbshards/database-sharding-white-paper/
此类方法的关键是了解您希望如何查询数据。当您必须从不同的角度查询某些数据时,上面的答案也很有用。在这种情况下,您需要以两种(或更多)格式写入数据,并根据每种结构对分片进行分区。再次使用上面的简单示例,假设您需要查询所有玩家的单个GameInstance。现在,您可以创建一个单独的“分片树”,其中GameInstance作为父级,PlayerGame作为子级,由GameInstanceId进行分片。现在该查询也很有效。
目标是尽可能多地进行单个分片操作,因为奇怪的分布式操作通常是分布式数据库集群的“邪恶”。
答案 1 :(得分:1)
根据您使用的数据,您可能会对其进行非规范化并将其分布到不同的数据库节点上。这会让你写得有点棘手,但会提高读取性能。