【发布时间】:2015-06-23 22:09:32
【问题描述】:
假设我有一个列族:
CREATE TABLE update_audit (
scopeid bigint,
formid bigint,
time timestamp,
record_link_id bigint,
ipaddress text,
user_zuid bigint,
value text,
PRIMARY KEY ((scopeid, formid), time)
) WITH CLUSTERING ORDER BY (time DESC)
有两个二级索引,其中record_link_id 是一个高基数列:
CREATE INDEX update_audit_id_idx ON update_audit (record_link_id);
CREATE INDEX update_audit_user_zuid_idx ON update_audit (user_zuid);
据我所知,Cassandra 将创建两个隐藏列族,如下所示:
CREATE TABLE update_audit_id_idx(
record_link_id bigint,
scopeid bigint,
formid bigint,
time timestamp
PRIMARY KEY ((record_link_id), scopeid, formid, time)
);
CREATE TABLE update_audit_user_zuid_idx(
user_zuid bigint,
scopeid bigint,
formid bigint,
time timestamp
PRIMARY KEY ((user_zuid), scopeid, formid, time)
);
Cassandra 二级索引是作为本地索引实现的,而不是像普通表那样分布。每个节点只为其存储的数据存储一个索引。
考虑以下查询:
select * from update_audit where scopeid=35 and formid=78005 and record_link_id=9897;
- 此查询将如何在 Cassandra 中“在后台”执行?
- 高基数列索引 (
record_link_id) 将如何影响其性能? - Cassandra 是否会触及上述查询的所有节点? 为什么?
- 首先执行哪个条件,基表partition_key还是二级索引partition_key? Cassandra 将如何交叉这两个结果?
【问题讨论】:
-
我的 2 美分:由于您指定了完整的分区键,因此查询所有节点是没有意义的。它显然应该只查询负责 (35, 78005) 的节点。由于 Cassandra 的设计方式,我希望它优先考虑减少所涉及节点的数量。鉴于此,唯一涉及的节点可能应该查看它有多少条记录 (35, 78005) 以及它在
record_link_id=9897的索引中有多少条记录,并使用最快的一条来提供查询(这不一定是最小的一个,取决于索引是否也按主键排序)。 -
我的理论似乎得到了docs.datastax.com/en/cql/3.0/cql/ddl/…的支持
-
如果是这样,那么在高基数列上创建索引将是最快和最好的数据模型(如果您在条件中也包括分区键)。
标签: cassandra cql cassandra-2.0 cql3