在水平缩放时,该做什么而不是SQL连接?

Dav*_* Xu 5 mysql scalability sharding

当我有一个庞大的复杂关系数据库,而这个数据库太大而无法放在一台机器上时,我会使用什么而不是SQL连接?我已经开始在许多机器上对数据库进行分片,但结果是,我无法再有效地进行连接.

有小费吗?

小智 9

有许多方法可以完成这项工作,一般的想法是以对相关数据进行分组的方式对数据进行分片.

作为一个简单(简单)的例子,如果你有一个Game数据库,你可以用相同的键(playerId)分割Player和PlayerGame数据.如果还有其他相关的表,您也可以添加它们,将其视为相关表的"分片树".然后,保证给定播放器的所有数据都在同一个分片中.然后,您可以在分片中执行联接,但不能跨分片执行内部联接.

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

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

  • 加入分片树(但不是交叉分片内连接,例如2个玩家之间)
  • 随时从分片表连接到全局表

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

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

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

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

目标是尽可能多地进行单个分片操作,因为奇怪的分布式操作通常是分布式数据库集群的"邪恶".

  • 链接已损坏 (4认同)