CASSANDRA/SCYLLA 的排序機制與RDBMS不同,在我們RDBMS熟悉的場景裡面,要拿出的資料是可以在查詢指令的時候,針對想要的欄位,下降冪或者升冪的排序指令(order by asc/desc)。
-- ex:
select * from users where id > 1000 order by grade desc,id asc;
CASSANDRA/SCYLLA 也有提供order by指令,但不是隨心所欲,像RDBMS想怎麼用就怎麼用,在create table時期就必須要設計好。
(此處 2020/09/22發現謬誤,原先說沒有提供ordery by指令,其實是有的,重新更新文章。)
關鍵就在於複合的primary key裡面的clustering key,若clustering key這個名詞印象模糊,可以建議回頭看看Day10. 主鍵(primary key)。
不同於RDBMS,要拿出的資料是可以在查詢指令的時候下降冪或者升冪的排序指令,CASSANDRA/SCYLLA寫入資料的時候,就決定好順序
,所以取出的順序一定是固定的。
(或者說寫入時,就按照clustering key的順序寫入)
在寫入時就必須決定好順序,意味著什麼?
這表示這張table,每一個clustering column你只能選擇ASC/DESC其中一種作法,無法同時滿足兩者。
系統預設是ASC
,如果要設置成DESC,請見以下示範:
關鍵字叫做clustering order
create table timeseries (
event_type text,
insertion_time timestamp,
event blob,
PRIMARY KEY (event_type, insertion_time)
)
WITH CLUSTERING ORDER BY (insertion_time DESC);
clustering key的設置在之前primary key的示範就有介紹可以設多組,每個clustering column在建立table的時候,就需要決定用預設的ASC,還是指定使用DESC。
而且,這個clustering key的前後順序
也是有意義的,因為這關乎寫入資料的位置。
如果clustering key有兩個,在寫入一筆新的資料時候,一定是先找到符合第一個clustering key順序的位置,再找第二個clustering key的位置。
如以下範例:
CREATE TABLE heartrate_v4 (
pet_chip_id uuid,
time timestamp,
heart_rate int,
pet_name text,
PRIMARY KEY (pet_chip_id, pet_name, heart_rate)
);
寫入時先看pet_name該寫到哪個順序位置,再看hear_rate而最終決定資料寫到哪裡。
換句話說,查詢的時候,也會是同樣概念。
如以下範例:
SELECT * from heartrate_v4 WHERE pet_chip_id = 123e4567-e89b-12d3-a456-426655440b23 AND heart_rate = 100;
這個查詢語法會失敗,因為不指定第一個clustering key條件,它會不知道怎麼找。
所以跟partition key一樣,在設定的時候有設多組,那麼查詢條件就都必需填寫
。
到今天為止,有沒有覺得CASSANDRA/SCYLLA的條件查詢方式,跟熟悉的RDBMS方式有天差地別呢?
其實只要弄懂原理,理解規則之後,也不是那麼困難。
少了查詢方面的彈性,是為了換取效能與高可擴充性,這是必然的取捨。
再進一步講解說明,其實oprater(=、>、<、>=、<=),根據欄位所屬不同種類的key,使用方式也有限制。
Index | Key | 運算子 |
---|---|---|
Praimary Key | Partition Key | 只能用 = |
Praimary Key | Clustering Key | 可以用 =、>、<、>=、<= |
Secondary Index | 只能用 = |
Partition Key 要明確指定,系統才知道資料位置在哪個node。
Secondary Index 要明確指定,系統才能反推 Praimary Key,而得知資料位置在哪個node。
Clustering Key本身屬於範圍查詢用途(range query),所以可以接受>、< 等篩選方式。
primary key欄位,可以在查詢語法裡面下order by,指定asc/desc排序,非primary key的欄位就是不行,原理在這幾篇都介紹了。
因為原本寫入時就有排序過,預設asc,在查詢語法若下order by X欄位 desc,只是它幫你將撈出來的資料反向(reverse)
呈現,實際上並不用特別花功夫在處理資料的排序。