cassandra的索引查詢和排序

江湖歸隱王嘉嘉發表於2015-05-08

轉自:http://zhaoyanblog.com/archives/499.html

cassandra的索引查詢和排序

cassandra的查詢雖然很弱,但是它也是支援索引和排序的,當然是簡陋的查詢,這一切都是為了追求效能的代價,所以要使用cassandra,你不能希望它完全適用你的邏輯,而是把你的邏輯設計的更適合cassandra。

第一:索引查詢
cassandra是支援建立二級索引的,索引可以建立在除了第一個主鍵之外所有的列上,當然有些型別除外,例如集合型別。
例如

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE test(
	a INT,
	b INT,
	c INT,
	d INT,
	e INT,
	m INT,
	PRIMARY KEY(a,b,c));
 
CREATE INDEX ON test(c);
CREATE INDEX ON test(e);

在第一主鍵a上建立索引是不可以的:

1
CREATE INDEX ON test(a) X

索引列只可以用=號查詢,所以

1
2
SELECT * FROM test WHERE e=1; //是可以
SELECT * FROM test WHERE e>1; //就不行了。

如果你的查詢條件裡,有一個是根據索引查詢,那其它非索引非主鍵欄位,可以通過加一個ALLOW FILTERING來過濾實現、
例如:

1
SELECT * FROM test WHERE e=1 AND m>2 ALLOW FILTERING;

雖然m欄位是非索引非主鍵欄位,但是隻要加了ALLOW FILTERING條件,它會先根據e=1查出來,再對結果進行m>2過濾

第二:排序
cassandra也是支援排序的,order by。 當然它的排序也是有條件的,
第一:必須有第一主鍵的=號查詢。cassandra的第一主鍵是決定記錄分佈在哪臺機器上,也就是說cassandra只支援單臺機器上的記錄排序。
第二:那就是隻能根據第二、三、四…主鍵進行有序的,相同的排序。
第三:不能有索引查詢

1
2
3
4
SELECT * FROM test WHERE a=1 ORDER BY b DESC;
SELECT * FROM test WHERE a=1 ORDER BY b DESC, c DESC;
SELECT * FROM test WHERE a=1 ORDER BY b ASC;
SELECT * FROM test WHERE a=1 ORDER BY b ASC, c ASC;

以上都是可以的。

1
2
3
4
SELECT * FROM test ORDER BY b DESC; //沒有第一主鍵 不行
SELECT * FROM test WHERE a=1 ORDER BY c DESC; //必須以第二主鍵開始排序
SELECT * FROM test WHERE a=1 ORDER BY b DESC, c ASC; //不是相同的排序。
SELECT * FROM test WHERE e=1 ORDER BY b DESC; //不能有索引。

其實cassandra的任何查詢,最後的結果都是有序的,預設的是b asc, c asc,因為它內部就是這樣儲存的。
這個我在《cassandra2.0 如何實現分頁查詢》文章中提到過。所以你使用b desc, c asc 或者b asc,c desc 去排序,cassandra是比較為難的。
當然這個預設儲存排序方式,是可以在建表的時候指定的。

1
2
3
4
5
6
7
8
9
CREATE TABLE test(
	a INT,
	b INT,
	c INT,
	d INT,
	e INT,
	m INT,
	PRIMARY KEY(a,b,c))
WITH CLUSTERING ORDER BY (b DESC, c ASC);

相關文章