2016-01-09 137 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

你的理解聽起來正確。當然,使用這樣的二級索引會非常低效。通常,最好設計您的模式,以便任何查詢都不需要二級索引。