CQL SELECT 大于索引非键列上的查询

2023-11-23

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

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

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

我想要的设置:

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


EDIT1

这里有一个案例可以解释这个问题。正如 rs-atl 指出的,这可能是数据模型问题。假设我在 stackoverflow 上保留了所有用户的列族。对于每个用户,我保留一批统计数据(声誉、答案数、投票数...所有这些都是整数)。我想查询这些统计数据以获取相关用户。

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

不幸的是,即使有二级索引,CQL 也要求 WHERE 子句在二级索引上至少有一个 EQ,因为性能问题.

问:为什么总是需要至少进行一次 EQ 比较 二级指标?

答:二级指标的不平等总是存在的 在内存中完成,因此在另一个二级索引上至少没有一个 EQ 您将加载数据库中的每一行,其中有大量 数据库不是一个好主意。因此,通过要求至少一个 EQ (辅助)索引,您希望限制需要读入的行集 内存到可管理的大小。 (虽然显然你仍然可以得到 也陷入麻烦)。

因此,基本上,如果您除了 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 数据库上的此类查询可能会减慢/使系统陷入困境。


Example

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

在 ValueS 和 Dummy Value 上创建二级索引:

cqlsh:demo> create index table1_valuea on table1 (valuea);
cqlsh:demo> create index table1_valueb on table1 (dummyvalue);

执行范围查询ValueA with 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CQL SELECT 大于索引非键列上的查询 的相关文章

随机推荐

  • MediaStore:获取图像数据、缩略图和文件夹

    我有两个清单 我们将它们称为AlbumsList 和PicturesList 第一个显示相册封面 其中一张图像 名称和其中的照片数量 第二个显示所选相册中包含的所有图像 我已经使用 File 类完成了此操作 但它运行速度太慢 并且当我只需要
  • 导航栏上方的 android Q 内容

    我们的应用程序的目标是 API 28 并在状态栏下绘制内容 为此 我们使用以下标志和样式 window addFlags FLAG LAYOUT NO LIMITS
  • jquery mobile 中的日期选择器在第二页中添加时是重复的

    我需要一些有关移动应用程序中日期选择器使用的帮助 我在我的应用程序中使用 jQuery UI 日期选择器 但是当我将日期选择器放在第二页时 它会显示两次 重复 但是 当我将日期选择器放在第一页时 显示正常 这是一个示例 如果您运行它 您可以
  • 有没有办法将命名范围组合成新的命名范围?

    I have class Foo lt ActiveRecord Base named scope a lambda a conditions gt a gt a named scope b lambda b conditions gt b
  • url 中的 django 用户名,而不是 id

    在一个迷你虚拟社区中 我有一个 profile view 功能 这样我就可以查看任何注册用户的个人资料 个人资料视图函数将个人资料所属的用户的 id 作为参数 因此当我想访问用户 2 的个人资料时 我会这样调用它 http 127 0 0
  • 如何使用 PowerShell Invoke-RestMethod 发送多部分/表单数据

    我正在尝试通过 Invoke RestMethod 在与带有 F 开关的curl 类似的上下文中发送文件 卷曲示例 curl F FileName path to file name https uri to post 在powershel
  • Elasticsearch节点重启后快速恢复

    考虑 elasticsearch yml 中的以下设置 gateway recover after data nodes 3 gateway recover after time 5m gateway expected data nodes
  • Linux 中对 pthread_create 的未定义引用

    我从网上获取了以下演示https computing llnl gov tutorials pthreads include
  • C++14 中不指定对象的左值

    我在这里使用 N3936 作为参考 如果 C 14 文本有任何不同 请更正此问题 3 10以下左值和右值我们有 每个表达式都属于该分类中的基本分类之一 左值 x值或纯右值 然而 定义lvalue reads An lvalue 指定一个函数
  • C 中的按位连接

    我正在尝试在 C 中连接两个二进制数 所以如果我有1010 and 0011我希望我的结果是10100011 我写了一个我认为可以完成这项工作的简短例程 include
  • Eclipse 优化导入以包括静态导入

    有没有办法让 Eclipse 自动查找静态导入 例如 现在我终于升级到了 Junit 4 我希望能够编写 assertEquals expectedValue actualValue hit Ctrl Shift O and have Ec
  • 重置 svg 填充 css

    我想让所有 svgs 都具有相同的纯色 所以我用 svg fill ccc 但我想在 hover 上获得默认填充 如何禁用填充并恢复默认值 您可以使用以下方法执行此操作 not 并有效地设置 不悬停 的样式 svg not hover fi
  • Jupyter:安装后没有名为“imblearn”的模块

    我在 ANACONDA Navigator 上安装了 imbalanced learn 版本 0 3 1 当我使用 Jupyter Python 3 运行不平衡学习网站上的示例时 from imblearn datasets import
  • Git版本兼容性

    使用 Git 进行版本控制 与不同版本的 Git 协同工作的效果如何 有关的体验 好还是坏 是什么 长话短说 我正在考虑将 Git 用于一些计划的家庭项目 但由于我使用存储库中的默认包进行的大杂烩设置将意味着完全不同的版本 我计划在运行 U
  • 关于 C# 变量作用域与其他语言的问题

    首先声明一下 我以前没用过C 对它了解不多 我正在学习 Sebesta 的 编程语言概念第 9 版 一书 准备 编程语言 考试 当我读到以下摘录自 范围声明顺序 第246页 时 我有点困惑 例如 在 C99 C Java 中 所有局部变量的
  • 没有RTTI的shared_ptr?

    我正在尝试使用shared ptr在使用 xc32 1 34 gcc 4 5 2 的衍生版本 构建的嵌入式项目中 该项目已禁用 RTTI fno rtti include
  • 如何在 MVC3 中从 javascript 调用控制器方法?

    我使用 MVC3 架构 c net 当焦点更改到下一个字段 即密码字段 时 我需要立即将文本框内容 用户 ID 与数据库进行比较 所以我想对 User Id 字段使用 onblur 事件 然后调用 Controller 方法 谁能告诉我如何
  • 通过套接字发送和接收数组

    是否可以使用Python通过UDP套接字发送数组 我正在使用 Python 2 5 并尝试发送一个简单的数组 但它不起作用 它可以成功发送数组 但是当我尝试使用数组的一项来打印它时 程序崩溃了 我不确定错误是什么 因为我采取了预防措施将数据
  • 使用 psycopg2 将 PostgreSQL UUID 数组作为列表返回

    我有一个 SQL 语句 其中包含嵌入在ARRAY 像这样 SELECT foo ARRAY SELECT x from y AS bar 查询工作正常 但是在 psycopg2 结果游标中 数组作为字符串返回 如 1 2 3 而不是列表 我
  • CQL SELECT 大于索引非键列上的查询

    EDIT1 在原始问题之后添加了一个案例来描述问题 我希望查询不属于我的键的列 如果我理解正确的话 我需要在该列上定义一个二级索引 但是 我希望使用大于条件 不仅仅是相等条件 但这似乎仍然不受支持 我错过了什么吗 您将如何解决这个问题 我想