分布式 SQL 提示和技巧

105 阅读4分钟

分布式SQL提示和技巧–2022年7月

Marko Rajcevic 【hudson译】

2022年7月25日

欢迎回到我们的分布式SQL提示和技巧博客,在这里我愉快地重温一下互联网上的分布式SQL问题。

什么情况下我应该用范围分片而不是散列分片?

如问题所述,YugabyteDB支持两种数据分片方法:按哈希和范围进行分片。创建表时选择了分片方法 ,或者设置表的主键。 默认情况下,您的主键将通过HASH进行分片,除非您根据升序还是降序按范围分区而调用ASC或DSC。如果您来自PostgreSQL,请注意这是因为PG索引是B-Tree,按范围逻辑排序。

使用主键索引的单行选择

由于YugabyteDB是一个OLTP数据库,使用主键索引进行单行选择时查询运行最有效。这些是哈希分片最有效的工作负载类型。在这里,它有助于避免热点,因为散列允许平均分布对tablet的访问。 如果对散列分片表或索引进行范围扫描,您将看到它效率较低。在这种情况下,对于选择一系列行的查询,按范围进行切分将更有效。但是,如果您可能有如下查询:

  select  * from  test_table where  id='foo' AND time<= NOW() for update skip locked   limit  1

您可以创建一个复合主键,其中第一列由HASH分割,第二列作为ASC或DSC中的聚簇键添加。

在上面的例子中,主键可以类似于primary key(id,time)。由于ASC是聚簇列的默认值,因此该表的数据将被哈希切分,id值相同的行将按时间升序聚簇。这将使上述查询更加高效。 每种方法都有其优缺点 。 如果您在区分分片(sharding)和分区(partitioning)概念方面有困难,我鼓励您查看Frank Pachot这篇很棒的博客 。 如果您渴望开始探索YugabyteDB,可以在 此处 测试示例中的这些方法

是否有必要在所有查询中使用主键?如果不使用主键,如何找到正确的tablet

在YugabyteDB中创建的任何表都由一个键进行切分,无论它是否由用户定义。系统分配的也同样适用,因此用户不会创建一个。 因此,对于用户定义的主键,如果有效地指定该键,YSQL可以找到该行。 如果您没有指定它,如上所述,YSQL没有其他选项,只能访问每一行,根据指定的过滤器验证它是否正确。 读取所有行称为“顺序扫描”,您可以使用 explain命令 显示查询规划,从中找到顺序扫描。 如果您有一个用户定义的键,但没有在查询中使用它,则会看到相同的行为。 YSQL将扫描所有节点上的所有数据,导致严重延迟。因此,我们始终鼓励用户创建主键,在查询中使用。在您可以访问表中其他列的情况下,您可以 创建索引 以加快该查询的性能。您还可以使用include关键字添加仅用于查询的数据,而不会用于索引排序。

什么情况下我应该使用Kafka还是使用xCluster异步复制?

xCluster存储层 支持的内置复制功能,它支持两个独立的YugabyteDB集群之间的异步复制,而不会导致额外的写入延迟。

此功能按更新的时间顺序复制事务日志(WAL),并提供至少一次的语义(可在 此处 找到其他功能和限制)。 如果需要跨两个区域复制特定的表,应该考虑使用此方法,因为它是内置的YugabyteDB特性。

Apache Kafka是架构中YugabyteDB和第三方软件之间一个额外组件,最适合 流或复制更改 。然而,YugabyteDB 使用 Debezium 连接器 本地支持变更数据捕获(CDC) 。(可适用大多数用例)。