cassandra - 为什么我不能在过滤主键后在 Cassandra 中添加 WHERE 子句?

标签 cassandra datastax nosql

编辑*感谢陌生人的代码格式化,我会记住的!

我遵循基本的planetcassandra.org Cassandra 教程,但我不明白为什么我不能执行以下查询:

select * 
from users 
where lastname = 'Smith' AND city = 'X';

在这张 table 上:

CREATE TABLE users 
(
    firstname text,
    lastname text,
    age int,
    email text,
    city text,
    PRIMARY KEY (lastname)
);

据我了解,分区键(姓氏)对数据进行分区。所以姓氏为 Smith 的所有行都应该在节点 X 上。是什么阻止我进一步按城市过滤这些行?

谢谢!

最佳答案

您的问题在这里有两个答案。一个特定于您的示例,一个更一般的答案(这可能是您真正追求的)。

回答你的例子

在您的具体示例中,您有一个主键“姓氏”。所以在这种情况下,每个分区只有一行。每当您使用姓氏“Smith”更新行时,您都会覆盖该行中的任何先前数据。在这种情况下,where 子句实际上没有意义,因为当您查询“Smith”行时,只会有一个结果。

更一般的答案

我猜你的意思是你的例子允许每个分区不止一行。可能类似于 PRIMARY KEY (lastname, user_id) (或集群键中的任何列,可以让您识别具有相同姓氏的不同用户)。

Cassandra 中的分区可能非常大。单个分区中可能有数百万行。主键中的集群列决定了这些行在存储在磁盘上时的排序方式。因此,当您对聚类列进行查询时,Cassandra 可以使用数据排序的知识来精确找到您要查找的数据。

如果 Cassandra 允许查询不在集群键中的列,则需要扫描分区内的所有数据并根据查询检查每一行。这将是非常低效的。

要进一步扩展集群列,集群列的实际顺序也很重要。如上所述,排序决定了行在磁盘上的存储方式。所以“PRIMARY KEY (a, b, c)”和“PRIMARY KEY (a, c, b)”是一样的。在第一个示例中,行在磁盘上首先按“b”列排序,然后“b”列具有相同值的所有行按“c”列排序。这意味着如果不指定“b”,您将无法在分区内查询具有“c”特定值的列。该查询将再次需要扫描整个分区,因为行首先按“b”排序。

预先了解要执行的确切查询将帮助您确定所需的集群键以及是否需要非规范化为多个表以支持多个查询。

关于cassandra - 为什么我不能在过滤主键后在 Cassandra 中添加 WHERE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29706734/

相关文章:

Cassandra : Does deleting a whole partition create tombstone?

cassandra - Java 驱动程序中的 CQL count() 相当于什么

cassandra - Datastax Java 驱动程序 4.x : How to get cluster name?

gis - NoSQL 和空间数据

nosql - NoSql 键/值数据库用于什么

Python Cassandra float 精度损失

java - 将 Cassandra blob 转换为文本

Cassandra 3.11 SSTableLoader 机制

java - 如何扩展 cassandra SessionManager 以进行 Instrumentation

java - 使用修订 ID 检索 CouchDB 文档的先前修订?