【问题标题】:Why cassandra/cql restrict to use where clause on a column that not indexed?为什么 cassandra/cql 限制在未索引的列上使用 where 子句?
【发布时间】:2025-12-31 12:30:11
【问题描述】:

我在 Cassandra 2.0.8 中有一张如下表:

创建表 emp ( 空整数, deptid int, 名字文本, 姓氏文本, 主键(empid,deptid) )

当我尝试通过以下方式搜索时:“select * from emp where first_name='John';”

cql shell 说:
“错误请求:使用 Equal 运算符的 by-columns 子句中不存在索引列”

我搜索了这个问题,它说的每个地方都为“first_name”列添加了二级索引。

但我需要知道为什么需要为该列编制索引的确切原因? 我唯一能弄清楚的是性能。 还有其他原因吗?

【问题讨论】:

    标签: cassandra-2.0 datastax-java-driver cqlsh


    【解决方案1】:

    Cassandra 不支持按任意列搜索。这是因为它会涉及扫描所有行,这是不受支持的。

    数据在内部被组织成可以与 HashMap[X, SortedMap[Y, Z]] 比较的东西。外部映射的键是一个分区键值,内部映射的键是所有聚类列值和某个常规列的名称的一种串联。

    除非您在列上有索引,否则您需要提供要通过查询收集的数据的完整(首选)或部分路径。因此,您应该设计您的架构,以便查询包含主键值和集群列的一些范围。

    您可以阅读关于什么是允许的,什么是不允许的here

    【讨论】: