【问题标题】:Creating secondary index on table in Cassandra在 Cassandra 中的表上创建二级索引
【发布时间】:2018-05-04 00:50:14
【问题描述】:

我刚刚开始研究 Cassandra。 我对辅助键的概念有点混淆。

根据我理解的定义,对未排序表的非键属性进行索引是二级索引。

所以我有这张桌子

CREATE TABLE IF NOT EXISTS userschema.user (id int,name text, address text, company text, PRIMARY KEY (id, name))

所以如果我创建这样的索引

CREATE INDEX IF NOT EXISTS user_name_index ON userschema.user (name)

这应该是二级索引。

但我的要求是创建包含列 name 、 id 、 company 的索引。

如何在 Cassandra 中创建这样的二级索引?

我得到了this 链接,它定义了这么短的东西,但是这些二级索引为什么不只是表格?

上面的这些用户表只是示例,不是实际的。

我正在使用 Cassandra 3.0.9

【问题讨论】:

  • 您将对该表运行哪些查询?查询通常有助于确定数据模型。
  • 有点像 PSA:您可能希望在此处避免使用二级索引。它们是为非常特定的用例(基数〜=节点数)而设计的,与人们习惯的许多关系数据库中的索引完全不同。而是创建一个新表并写入两者。

标签: cassandra cassandra-3.0


【解决方案1】:

idname 已经是主键的一部分。

所以下面的查询会起作用

SELECT * FROM table WHERE id=1
SELECT * FROM table WHERE id=1 and name='some value'
SELECT * FROM table WHERE name='some value' ALLOW FILTERING (This is inefficeint)

您可以在公司列上创建二级索引

CREATE INDEX IF NOT EXISTS company_index ON userschema.user (company)

现在,一旦定义了二级索引,就可以在 where 子句中与主键一起使用。

SELECT * FROM table WHERE id=1 and name='some value' and company='some value'

虽然SELECT * FROM table WHERE company='some value' ALLOW FILTERING 有效,但效率非常低。

在创建二级索引之前看看When to use secondary index in cassandra

【讨论】:

    【解决方案2】:

    您提到的链接主要关注物化视图,我们在其中创建虚拟表来执行具有非主键的查询。 此外,您似乎正在创建主键上的辅助键,您已经在创建表时定义了该主键。永远记住二级索引应该是非主键。

    要对二级索引有一个清晰的了解- 请参阅此https://docs.datastax.com/en/cql/3.3/cql/cql_using/useSecondaryIndex.html

    现在,二级索引替代方法的优缺点

    1.物化视图:

    它将创建新的虚拟表,您应该使用旧表和原始表中的旧主键和新实体化表中的新虚拟主键在虚拟表中运行查询。原始旧表中数据修改的任何更改都将反映在物化表中。如果您删除物化表,但数据将创建为墓碑,其 gcc_graceseconds 默认为 864000(10 天)。删除物化表不会对原始表产生任何影响。

    2.允许过滤:

    它的效率非常低,完全不建议使用允许过滤,因为延迟会很高并且性能会下降。

    如果您想了解更多信息,请参阅此链接How do secondary indexes work in Cassandra?

    如果我错了,请纠正我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2013-12-04
      • 2022-08-11
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多