gpt4 book ai didi

mysql - 在水平扩展时应该做什么而不是 SQL 连接?

转载 作者:可可西里 更新时间:2023-11-01 07:00:15 25 4
gpt4 key购买 nike

当我有一个大型复杂的关系数据库,它变得太大而无法容纳在一台机器上时,我应该使用什么来代替 SQL 连接?我已经开始在多台机器上对数据库进行分片,但结果是,我无法再有效地进行连接。

有什么建议吗?

最佳答案

有很多方法可以实现这项工作,一般的想法是以将相关数据分组的方式对数据进行分片。

作为一个简单(琐碎)的示例,如果您有一个游戏数据库,则可以通过相同的键 (playerId) 对 Player 和 PlayerGame 数据进行分片。如果还有其他相关的表,您也可以添加它们,将其视为相关表的“分片树”。然后将保证给定 Player 的所有数据都在同一个分片中。然后,您可以在分片内执行联接,但不能跨分片执行内部联接。

另一种常用技术是将全局表复制到所有分片,这些表通常不经常更新,但在大量连接中使用。

通过这两种方法,您可以:

  • 在分片树内加入(但不是跨分片内部加入,例如,在 2 个玩家之间)
  • 随时从分表加入全局表

然后另一个技巧是分布式查询,您可能需要汇总来自许多分片的结果(例如,所有玩家的计数)。

这是一份白皮书,更详细地描述了其中的很多内容:

http://dbshards.com/dbshards/database-sharding-white-paper/

这种方法的关键是了解您希望如何查询数据。当您必须从不同的角度查询某些数据时,上面的答案也很有用,可以对某些数据进行反规范化。在这种情况下,您需要以两种(或更多)格式写入数据,并根据每种结构对分片进行分区。再次使用上面的简单示例,假设您需要查询所有 Player 以获取单个 GameInstance。现在您可以创建一个单独的“分片树”,其中 GameInstance 作为父代,PlayerGame 作为子代,由 GameInstanceId 分片。现在该查询也将变得高效。

目标是拥有尽可能多的单个分片操作,因为奇怪的是,分布式操作通常是分布式数据库集群的“罪恶”。

关于mysql - 在水平扩展时应该做什么而不是 SQL 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com