本文介紹cassandra支援的,目前我所知道的所有查詢表達式類型。如果你需要更複雜的查詢,單單依靠cassandra是很難做到的,你需要借助其它手段或者工具。
cassandra目前支援的表達式目前有三種:
我們先假設我們的表結構是這樣的:
CREATE TABLE test(
a INT,
b INT,
c INT,
d INT,
e INT,
PRIMARY KEY(a,b,c,d)
);
CREATE INDEX ON test(e);
1、字首表達式
就是查詢條件必須是主鍵,且前面的主鍵是=号,隻有最後一個主鍵是> >= < <=。
舉例:
SELECT * FROM test WHERE a=1 AND b>2;
SELECT * FROM test WHERE a=1 AND b=1 AND c>2;
SELECT * FROM test WHERE a=1 AND b=1 AND c=1 AND d>2;
SELECT * FROM test WHERE a=1 AND b=1 AND c>2 AND c<2;
以上都是可行的。
SELECT * FROM test WHERE a>1;
//不行,第一主鍵隻能用=号
SELECT * FROM test WHERE a=1 AND c>2;
//不行 中間不能有跳躍
SELECT * FROM test WHERE a=1 AND b>2 AND b>=2;
//不行,同一個主鍵不能同時用> >= = 或者< <= =
2、不含第一主鍵的字首表達式
這類表達式,需要加上ALLOW FILTERING來查詢,這樣的查詢效率肯定是低一些
舉例:
SELECT * FROM test WHERE b>2 ALLOW FILTERING;
SELECT * FROM test WHERE b=1 AND c>2 ALLOW FILTERING;
SELECT * FROM test WHERE b=1 AND c=1 AND d>2 ALLOW FILTERING;
SELECT * FROM test WHERE b=1 AND c>2 AND c<2 ALLOW FILTERING;
3、包含索引列查詢
舉例:
SELECT * FROM test WHERE e=1;
//隻含索引
SELECT * FROM test WHERE a=1 AND b=1 AND c>1 AND e=1;
//包含索引列和字首表達式的組合
SELECT * FROM test WHERE b=1 AND c>1 AND e=1;
//包含索引列和不含第一主鍵的字首表達式的組合 不需要ALLOW FILTERING
SELECT * FROM test WHERE c>1 AND e=1 ALLOW FILTERING;
//除此之外和任意其它表達式的組合,都可以進行查詢,
//前提是要加ALLOW FILTERING;
最後說一下,cassandra查詢出來的結果,無論什麼查詢結果,都是先按token(a)排序,再按b排序 再按c排序,再按d排序:
a | b | c | d | e
---+---+---+---+---
13 | 2 | 3 | 4 | 5
1 | 2 | 1 | 4 | 5
1 | 2 | 3 | 1 | 5
1 | 2 | 3 | 2 | 5
1 | 2 | 3 | 4 | 5
1 | 2 | 3 | 7 | 5
1 | 2 | 6 | 4 | 5
1 | 3 | 2 | 4 | 5
1 | 4 | 3 | 7 | 5
1 | 7 | 3 | 7 | 5
2 | 2 | 3 | 4 | 5
21 | 2 | 3 | 4 | 5
這有助你進行分頁查詢