gpt4 book ai didi

indexing - CQL SELECT 大于对索引非键列的查询

转载 作者:行者123 更新时间:2023-12-04 06:42:04 24 4
gpt4 key购买 nike

EDIT1:在原始问题之后添加了一个案例来描述问题。

我希望查询不属于我的 key 的列。如果我理解正确,我需要在该列上定义二级索引。但是,我希望使用大于条件(不仅仅是相等条件)并且这似乎仍然不受支持。

我错过了什么吗?
你会如何解决这个问题?

我想要的设置:

Cassandra 1.1.6
CQL3

CREATE TABLE Table1(
KeyA int,
KeyB int,
ValueA int,
PRIMARY KEY (KeyA, KeyB)
);

CREATE INDEX ON Table1 (ValueA);

SELECT * FROM Table1 WHERE ValueA > 3000;

由于在 Cassandra 1.1.6 中仍然不支持在带有复合键的 ColumnFamilies 上定义二级索引,因此我必须解决删除其中一个键的临时解决方案,但我仍然遇到与非相等条件相同的问题。

有没有其他方法可以解决这个问题?

感谢您的时间。

相关来源:
http://cassandra.apache.org/doc/cql3/CQL.html#selectStmt
http://www.datastax.com/docs/1.1/ddl/indexes

编辑1

这是一个可以解释问题的案例。正如 rs-atl 所指出的,这可能是数据模型问题。假设我在 stackoverflow 上保留了所有用户的列族。对于每个用户,我保留了一批统计数据(声誉、NumOfAnswers、NumOfVotes...所有这些都是整数)。我想查询这些统计信息以获取相关用户。
CREATE TABLE UserStats(
UserID int,
Reputation int,
NumOfAnswers int,
.
.
.
A lot of stats...
.
.
.
NumOfVotes int,
PRIMARY KEY (UserID)
);

现在我有兴趣根据这些统计信息切片 UserID。我想要所有拥有超过 10K 声誉的用户,我想要所有回答少于 5 个的用户,等等。

我希望这有帮助。再次感谢。

最佳答案

在 CQL 中,您可以应用 WHERE一旦为它们创建了索引(即二级索引),所有列上的子句。否则,您将收到以下错误:

Bad Request: No indexed columns present in by-columns clause with Equal operator

不幸的是,即使有二级索引,由于 performance issue,CQL 要求 WHERE 子句在二级索引上至少有一个 EQ。 .

Q: Why is it necessary to always have at least one EQ comparison on secondary indices?

A: Inequalities on secondary indices are always done in memory, so without at least one EQ on another secondary index you will be loading every row in the database, which with a massive database isn't a good idea. So by requiring at least one EQ on an (secondary) index, you hopefully limit the set of rows that need to be read into memory to a manageable size. (Although obviously you can still get into trouble with that as well).



因此,基本上,如果您除了 EQ 比较之外还有任何其他内容,它会加载“以其他方式匹配”您的查询的所有行,并一次检查它们是否匹配。默认情况下不允许这样做,因为它“可能很慢”。 (本质上,索引仅索引“相等”,而不是像 < 和 > 这样的关系数据库上的索引)。

需要注意的一件事是,如果您在二级索引上有多个非 EQ 条件,您还需要包括 ALLOW FILTERING查询中的关键字,否则你会得到
Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING
一种简单的解决方法是将一个虚拟列附加到您的表中,其中所有行在该列上都具有相同的值。因此,在这种情况下,您可以仅对所需的列执行范围查询。请务必意识到,在 NoSQL 数据库上进行此类查询可能会使系统变慢/陷入困境。

示例
cqlsh:demo> desc table table1;

CREATE TABLE table1 (
keya int,
keyb int,
dummyvalue int,
valuea int,
PRIMARY KEY (keya, keyb)
) ....

cqlsh:demo> select * from Table1;

keya | keyb | dummyvalue | valuea
------+------+------------+--------
1 | 2 | 0 | 3
4 | 5 | 0 | 6
7 | 8 | 0 | 9

在 ValueA 和 DummyValue 上创建二级索引:
cqlsh:demo> create index table1_valuea on table1 (valuea);
cqlsh:demo> create index table1_valueb on table1 (dummyvalue);

ValueA 上执行范围查询与 DummyValue=0 :
cqlsh:demo> select * from table1 where dummyvalue = 0 and valuea > 5 allow filtering;

keya | keyb | dummyvalue | valuea
------+------+------------+--------
4 | 5 | 0 | 6
7 | 8 | 0 | 9

关于indexing - CQL SELECT 大于对索引非键列的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com