首页 > 解决方案 > 是否可以使用辅助分片密钥对 Visess 进行分片

问题描述

我们正在使用 Vitess 数据库在 mysql 中扩展和实现水平分片。是否可以在 Vitess 中做二级分片。

例如: Table 1 - Agency ( AgencyID INT, CreatedOn DATETIME )

Table 2 - PayrollDetails ( AgencyID INT FOREIGN KEY TO Agency Table, PayrollID INT, PayrollCreatedOn DATETIME )

现在我们使用 AgencyID 作为分片键对两个表进行分片。但是 PayrollDetails 表非常庞大,它有超过 1 亿条记录。所以现在我们计划再次使用 PayrollCreatedOn 字段对 PayrollDetails 表进行分片,两个表的 Primary Shard 都应该使用 Agency Key 但 payrollDetails 表应该使用 AgencyID 和 PayrollCreatedOn 进行分片。我们如何在 Vitess 中实现它?

标签: vitesskubernetes-vitess

解决方案


从概念上讲,分片键(主 vindex)用于决定一行进入哪个分片。因此,不可能有两个分片键,因为它们会指定行的冲突位置。

如果我理解正确,你想PayrollCreatedOn在 where 子句中查询表,你可以创建一个辅助 Vindex。这将创建一个查找表,指向行所在的位置,Vitess 可以利用它。这里有一个解释:https ://vitess.io/docs/reference/vindexes/ 。有一个名为的新命令CreateLookupVindex能够回填此查找表。不过,它还没有被记录在案。

Vitess 还允许您通过使用不同的主 vindex 来“实现”表。在这种情况下,第二个表将是第一个表的实时副本,但分片方式不同。您可以在 vitess 首页上看到一个演示(向下滚动到视频)。


推荐阅读