我刚刚开始使用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?
我正在尝试为消息框应用程序找到最佳的数据模型。该消息按以下顺序显示:首先出现 \xe2\x80\x98unread\xe2\x80\x99,然后当用户滚动时,将出现 \xe2\x80\x98read\xe2\x80\x99 消息。在这两个类别中,我想按到达时间对消息进行排序。类似于 Gmail 中的优先收件箱。
\n\n我想使用的第一个模式是:
\n\nCREATE 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);\nRun Code Online (Sandbox Code Playgroud)\n\n所以我的数据首先按布尔字段排序,然后按时间排序。现在,我可以轻松地先查看“未读”消息,在它们全部结束后,我将开始阅读“已读”消息。
\n\n问题是我无法更新任何消息状态,因为它是主键的一部分。我可以执行删除然后插入批量操作,它也是同一行。
\n\n另一个解决方案是:
\n\nCREATE 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)\nRun Code Online (Sandbox Code Playgroud)\n\n每个状态都有一行。我获得了非常轻松的访问权限,但这是否意味着我必须处理交易?读取消息时,我必须从 \xe2\x80\x98unread\xe2\x80\x99 行中删除它,并将其插入到 \xe2\x80\x98read\xe2\x80\x99 行,它们可能位于不同的分区中。
\n\n分区键的另一个版本可以是:
\n\nPRIMARY KEY(userId, messageId)\nRun Code Online (Sandbox Code Playgroud)\n\n然后我会在 isRead 上添加一个二级索引。我的查询将始终针对某个用户而不是一组用户。
\n\n有什么更好的想法吗?或者还有其他的建模想法吗?
\ndata-modeling cql cassandra secondary-indexes clustering-key
我可以用来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)