2016-01-09 138 views
0

想象我有这样的一个表:索引卡桑德拉查询

CREATE TABLE test(
    name TEXT, 
    tag TEXT, 
    id UUID, 
    parameter INT, 
    PRIMARY KEY((name, tag, id), parameter) 
); 

和索引

CREATE INDEX parameter_idx on test(parameter); 

有了这样的查询:

SELECT * FROM test WHERE name = 'name' 
        AND tag = 'tag' 
        AND parameter = value; 

它是正确的,因为索引将使用,返回多个分区,然后这些分区将被过滤,因此要求ALLOW FILTERING

相反查询像这样的:

SELECT * FROM test WHERE name = 'name' 
        AND tag = 'tag' 
        AND id = some_id, 
        AND parameter = value; 

将不会使用索引,一个分区会被发现,只相当于parameter = value一些行会被退回。

这一切是否正确?

+0

您的第一个查询无效。您始终必须提供分区键的所有列。 – Ralf

+0

它确实有效,因为'parameter'是一个索引并且因为允许过滤。除了潜在的错字以外,问题中的所有内容都适用,我只想确认我明白为什么以及如何。 –

+0

啊,对。我对它的工作原理与你的一样。但我的CQL体验有限...... – Ralf

回答

1

你的理解听起来正确。当然,使用这样的二级索引会非常低效。通常,最好设计您的模式,以便任何查询都不需要二级索引。