Cassandra 分区键

Cassandra partion Key

目前,我正在探索 cassandra 并有一个特殊的用例来设计应用程序的支持视图

我的访问模式。

获取特定交易

select * from purchase_by_user where userid='Tom' and transaction_date='1/20/22'
select * from purchase_by_user where userid='Jerry' and transaction_date <=1/21/22 and transaction_date >= '1/16/22'
select * from purchase_by_user where userid='Tom' and amount="100"
select * from purchase by user where user='Jerry' and amount>='50'

Create table purchase_by_user (
   order_id uuid,
   amount decimal,
   transaction_ts timestamp,
   user_id text,
   Primary key((user_id), uuid)
)

假设 Tom 正在制作数百万个订单,使用上面的分区键,数据将不会均匀地分布在集群中,而且这里的搜索也会很昂贵。

任何人都可以帮忙,这里有什么更好的分区密钥。

您可以使用分桶的概念来减少单个分区中的行数。例如,您可以创建一个类似 (user_id int, bucket_number int) 的密钥。您可以在此处确定预期数据大小的最大值 bucket_number。如果您希望此用户可以下百万订单,那么您可以将存储桶值设置为 1000。主要思想是关注您最终不会创建包含大量行的分区。

我会使用这样的 PRIMARY KEY 定义:

PRIMARY KEY((user_id, transaction_year), transaction_date, order_id)
) WITH CLUSTERING ORDER BY (transaction_date DESC, order_id ASC)

这利用了 Manish 提到的“分桶”概念。在这种情况下,如果 Tom 每天都创建一个订单,那么每个分区中将只有 365 个。

Lets say Tom is making millions of orders

事实上,即使 Tom 每天下 两个 个订单,它仍然只有 730 个。百万订单恐怕不太现实。

此外,上面的一些查询在范围查询中使用了 transaction_date。我添加了 transaction_date 作为支持这些查询的第一个集群键。如果 transaction_date 处于 DESC 结束顺序,则 most-recent 事务将位于分区的“顶部”(它们将首先被读取),这通常是大多数 date/time-driven 应用程序趋于正常运行。