在Cassandra中创建表的二级索引
我刚刚开始研究卡桑德拉。 我对辅键的概念有点困惑 从定义上,我理解的是对未排序的表的非键属性进行索引是二级索引 我有这张桌子在Cassandra中创建表的二级索引,cassandra,cassandra-3.0,Cassandra,Cassandra 3.0,我刚刚开始研究卡桑德拉。 我对辅键的概念有点困惑 从定义上,我理解的是对未排序的表的非键属性进行索引是二级索引 我有这张桌子 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.us
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中创建这样的二级索引
我得到了一个链接,它定义了这么短的内容,但是为什么这些二级索引不只是表呢
上述用户表只是示例,而不是实际的用户表
我正在使用Cassandra 3.0.9
id
和name
已经是主键的一部分
SELECT * FROM table WHERE id=1 and name='some value' and company='some value'
因此,以下查询将起作用
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 company='some value'允许过滤的表
起作用,但效率很低
在创建二级索引之前,请先看一下,您提到的链接主要关注物化视图,其中我们创建虚拟表以使用非主键执行查询。 此外,您似乎正在主键上创建辅助键,您已经在表的创建中定义了主键。请始终记住,辅助索引应该是非主键
SELECT * FROM table WHERE id=1 and name='some value' and company='some value'
要清楚了解二级索引,请参阅此
现在,二级索引替代方法的利弊
1.物化视图:
它将创建新的虚拟表,您应该使用旧表和原始表中的旧主键以及新物化表中的新虚拟主键在虚拟表中运行查询。原始旧表中数据修改的任何更改都将反映在物化表中。如果删除物化表,但数据将创建为默认gcc_graceseconds为864000(10天)的墓碑。删除物化表不会对原始表产生任何影响
2.允许过滤:
这是非常低效的,不建议使用允许筛选,因为延迟会很高,性能会降低
如果您想了解更多信息,也可以参考此链接
如果我错了,请纠正我您将对此表运行哪些查询?查询通常有助于确定数据模型。有点像PSA:您可能希望在这里避免使用二级索引。它们是为非常特定的用例(基数~=节点数)而设计的,与人们习惯使用的许多关系数据库中的索引不同。相反,创建一个新表并写入这两个表。