标签: clustering-key

Cassandra - 查询聚类键

我刚刚开始使用Cassandra,我正在尝试创建具有不同分区和群集密钥的表,以查看它们如何以不同方式查询.

我用表格的主键创建了一个表 - (a),b,c,其中a是分区键,b,c是聚类键.

查询时我注意到以下查询:

select * from tablename where b=val;
Run Code Online (Sandbox Code Playgroud)

结果是:

无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能.如果要在性能不可预测的情况下执行此查询,请使用ALLOW FILTERING

使用"ALLOW FILTERING"可以得到我想要的东西(尽管我听说它对性能有害).

但是当我运行以下查询时:

select * from tablename where c=val;
Run Code Online (Sandbox Code Playgroud)

它说:

PRIMARY KEY列"c"不能被限制(前一列"b"不受限制或非EQ关系)

并且根本没有"允许过滤"选项.

我的问题是 - 为什么所有的聚类键都不一样?与分区键"a"相邻的列b被赋予"允许过滤"选项,允许查询它,而查询列"c"似乎根本不可能(给定该表的布局方式).

允许过滤获取cassandra扫描所有SSTable并在分区键丢失时从中获取数据,那么为什么我们不能执行相同的列c?

cql primary-key cassandra clustering-key

12
推荐指数
1
解决办法
5115
查看次数

Cassandra 对消息收件箱的已读/未读状态进行建模,CQL

我正在尝试为消息框应用程序找到最佳的数据模型。该消息按以下顺序显示:首先出现 \xe2\x80\x98unread\xe2\x80\x99,然后当用户滚动时,将出现 \xe2\x80\x98read\xe2\x80\x99 消息。在这两个类别中,我想按到达时间对消息进行排序。类似于 Gmail 中的优先收件箱。

\n\n

我想使用的第一个模式是:

\n\n
CREATE TABLE inbox \n    (userId     uuid,\n     messageId  timeuuid,\n     data       blob,\n     isRead     boolean,\n  PRIMARY KEY(userId, isRead, messageId))\n  WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我的数据首先按布尔字段排序,然后按时间排序。现在,我可以轻松地先查看“未读”消息,在它们全部结束后,我将开始阅读“已读”消息。

\n\n

问题是我无法更新任何消息状态,因为它是主键的一部分。我可以执行删除然后插入批量操作,它也是同一行。

\n\n

另一个解决方案是:

\n\n
CREATE TABLE inbox\n    (userId     uuid,\n     messageId  timeuuid,\n     data       blob,\n     isRead     boolean,\n  PRIMARY KEY((userId, isRead), messageId))\n  WITH CLUSTERING ORDER BY (messageId DESC)\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个状态都有一行。我获得了非常轻松的访问权限,但这是否意味着我必须处理交易?读取消息时,我必须从 \xe2\x80\x98unread\xe2\x80\x99 行中删除它,并将其插入到 \xe2\x80\x98read\xe2\x80\x99 行,它们可能位于不同的分区中。

\n\n

分区键的另一个版本可以是:

\n\n
PRIMARY KEY(userId, messageId)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我会在 isRead 上添加一个二级索引。我的查询将始终针对某个用户而不是一组用户。

\n\n

有什么更好的想法吗?或者还有其他的建模想法吗?

\n

data-modeling cql cassandra secondary-indexes clustering-key

5
推荐指数
1
解决办法
695
查看次数

雪花显示带有 cluster_by 的表

我可以用来show tables in <database name>显示数据库中的所有表。返回的结果显示表是否启用了集群 - 显示cluster_by列。有没有办法获取 cluster_by 中有价值的所有表的列表?

show-tables的文档仅显示:

SHOW [ TERSE ] TABLES [ HISTORY ] [ LIKE '<pattern>' ]
                                  [ IN { ACCOUNT | DATABASE [ <db_name> ] | SCHEMA [ <schema_name> ] } ]
                                  [ STARTS WITH '<name_string>' ]
                                  [ LIMIT <rows> [ FROM '<name_string>' ] ]
Run Code Online (Sandbox Code Playgroud)

clustering-key snowflake-cloud-data-platform

4
推荐指数
1
解决办法
3425
查看次数