特定列的 Cassandra where 子句 - 最佳方法

Posted

技术标签:

【中文标题】特定列的 Cassandra where 子句 - 最佳方法【英文标题】:Cassandra where clause for specific column - best approach 【发布时间】:2019-03-16 09:33:20 【问题描述】:

在我的 cassandra 数据库中搜索具有特定 PID 的记录时,我需要使用 where 子句

id = uuid
pid=  Property Id (text)
created_at = timestamp

我需要查找特定属性 ID 的前 5 条记录。所以我的创建表是这样的。

CREATE TABLE property_tax (
    id uuid,
    state text, 
    area text,       
    balance_type text,
    created_at timestamp,
    created_by text,
    last_paid_at timestamp,
    max_tax float,
    min_tax float,
    pid text,
    prev_balance float,
    prev_interest float,
    property_type text,
    tax_cess float,
    tax_year timestamp,
    total_paid float,
    total_paid_cess float,
    total_paid_tax float,
    PRIMARY KEY (pid,created_at,id)
    );

我的查询看起来像这样

select * from property_tax where pid = 'property1' ORDER BY created_at DESC LIMIT 5;

它按照我的要求工作,但我的方法是否正确?还是需要改变。将来是否会出现任何性能问题。我正在查看 5 亿条记录并且还在增长。

新编辑:

我添加了两列 1.state 2.area 该州将有多个地区

属性 ID(pid) 会有多条记录,不超过 100 条记录

So, I need to query TABLE property_tax for below
1. Find all the pid
2. find all the pid in the area
3. find all the pid in the state
4. find Limit 5 for pid (ORDER_BY created_at DESC)

非常感谢 沙市

【问题讨论】:

单个 pid 分区内有 5 亿个 pid 或 id? 500 万个 pid,每个 pid 下有 100 个 Id。 【参考方案1】:

如果您总是以这种方式进行查询,请添加WITH CLUSTERING ORDER BY (created_at DESC);,这样您就不需要逆序读取(效率更高一些)。但这是对该表的一个很好的查询。

鉴于它有 5 亿个 pid,您的意思是它会运行良好。如果单个 pid 中有 5 亿个 id,您最终可能会得到一个非常宽的分区,这会对性能产生影响。

【讨论】:

我有一个问题:如果pid是5亿不就意味着它会创建5亿个partition吗?我正在考虑创建 PRIMARY KEY (tax_year,pid,created_at,id)。因此分区将仅适用于 tax_year 并且所有记录都在其中。我的理解错了吗? 5 亿个分区不算多,可以。通常每个节点大约 1 到 40 亿,它开始对维修产生不良影响(取决于硬件)。调整分区大小有点有趣——很多事情都会起作用,但太大或太小都会影响性能(读取、修复或压缩)。真正重要的问题是您希望如何查询它以及数据的基数。 如果您想按属性和年份查找它,那么使用年份作为您的密钥将起作用,但如果您想要过去 5 年,这意味着进行 5 次查询,最好只使用 pid .此外,将全年的所有财产(5 亿?)放在一个非常宽的行中,可能根本无法使用,因此需要其他的东西,比如州或县。 嗨,克里斯,感谢您在这里帮助我感谢它。我仍在为我的要求制定最佳查询。我在他的主要问题中添加了附加信息,你能帮我吗

以上是关于特定列的 Cassandra where 子句 - 最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 表 - 使用 where 子句选择查询

如何为 where 子句中的列编写具有不连续值的 Cassandra 查询

Cassandra Where子句中的IN查询

深入理解CQL中的Where子句

使用 sequelize 包含列的 where 子句

查询以选择具有特定最后一列的所有表 Ibm Db2 z/os