天天看點

cassandra支援的查詢表達式

本文介紹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
           

 這有助你進行分頁查詢

繼續閱讀