考虑这个例子:
create table bite (
id varchar PRIMARY KEY,
feedid varchar,
score bigint,
data varchar
);
create index bite_feedid on bite (feedid);
create index bite_score on bite (score);
我不确定最后两行create index..
的作用是什么?
它为什么如此重要?它会创建一个新表吗?如果是这样,我怎么能用它来查找?
由于
答案 0 :(得分:6)
辅助索引使用索引列作为主键创建新表。这种方法的优点是您对表的写/删除操作将自动转换为多次操作,您不必关心它。既然Cassandra支持记录批次,它似乎不是一个很大的优势,但在Cassandra 0.7 ... 1.1是一个很大的东西。
当索引上的查询将始终检索一个结果时,不应使用辅助索引(例如:将二级索引放在uuid上)。
s.i的一个很好的特点。是你可以在不知道任何主键的情况下查询单个列,并将主键的一部分与辅助索引组合在一起(使用AND运算符)。
您无法在AND中执行多个二级索引的WHERE子句。
HTH, 卡罗
答案 1 :(得分:5)
create index为表创建二级索引。在cassandra中,数据存储在跨节点的分区中 - 一个分区对应于一个分区键 - 这是主键的第一个键。主键中的剩余键构成群集键。例如,如果您有以下内容:
CREATE TABLE foo.people( id int, 姓名文字, 年龄int, 工作文本, PRIMARY KEY(id,name,job) )
id将是分区键,name和job将成为聚类键。
分区中的数据按群集键的顺序存储。使用过滤器查询时,指定分区键,然后可以根据群集键过滤掉。对于多个群集键,必须指定以前的群集才能使用特定群集。例如,在上述场景中,您可以执行
其中id = 2且name ='john'和job ='dev'或 其中id = 2且name ='john'
但不是 其中id = 2且job ='dev' 因为名称出现在聚类键中的作业之前。
您不能对年龄进行过滤,因为它不是密钥的一部分。这是二级索引的来源。如果你这样做: 在人(年龄)上创建索引等等
你将被允许这样做: 从年龄= 45岁的人中选择*;
这可能会很昂贵,因为它会在您的群集中进行查询。以下但是效率很高: 从id = 2且年龄= 45的人中选择*;
这对时间序列或其他宽行格式很有用。
对二级索引的查询是限制性的 - 例如,您不能进行范围查询 - 您只能进行=检查。
cassandra中的二级索引可以节省您自己维护索引表的麻烦,并且比您手动执行此操作更有效。它们最终是一致的(您的写入不会等待索引更新以返回成功),并且当前,节点数据的索引信息存储在本地。
最后,您可以从系统密钥空间中的“IndexInfo”表中找到当前的索引。
希望有所帮助。
答案 2 :(得分:2)
通常在传统数据库中创建索引将使用数据结构,例如HashMap,其键将是索引列,值指向表中的实际行。这样它允许查询基于大约O(1)的索引键来获取结果。
索引是如何创建的?索引列中的每个键都使用散列函数进行散列,它将返回一个值并将其用作索引。
在Cassandra数据库中,由于数据(即)特定列本身是分布式的,因此使用特殊机制来实现上述索引。
索引意味着快速检索或快速读取。但需要注意的是,过多的索引也会导致索引键中的冲突等不良内容。