iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0

在剛接觸CASSANDRA/SCYLLA的時候,筆者對於query怎麼下where條件,感到十分困惑,明明CQL這麼地像SQL語法,卻碰到where條件如果不是指定primary key欄位,就會出現以下的提示。

Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING

那是因為分散式資料庫,本身資料就是分散放置的,在查詢資料的時候,有沒有符合搜尋條件,需要全部看過一遍再挑選,效能變得不可預期。

因此CQL的條件查詢,比起SQL而言相對嚴苛很多。

上一篇講到primary key的組成結構,如果單一primary key,也就同等於partition key,這個索引本身就能夠幫助資料篩選,CASSANDRA/SCYLLA並不用看過所有的資料,再篩選出符合條件的部分,而是直接能找到根據條件搜尋的指定資料。

如果primary key 是複合型的,也就是說partition key + clustering key,事情會麻煩一點,where條件即使有在clustering key,但是沒有篩選partition key的話,一樣CASSANDRA/SCYLLA會需要全部撈出來後,再進行篩選。

如上一篇舉的範例結構,今天where 條件只看rank,而沒有race_year和race_name是不被允許的。

cqlsh> USE cycling;
CREATE TABLE rank_by_year_and_name ( 
race_year int, 
race_name text, 
cyclist_name text, 
rank int, 
PRIMARY KEY ((race_year, race_name), rank) 
);

那麼不巧想搜尋的條件不是primary key,或者條件又不在partition key,該怎麼呢?

有兩個東西可以解決問,分別是ALLOW FILTERINGsecondary index

今天先介紹ALLOW FILTERING,明天介紹次索引(secondary index)。

ALLOW FILTERING就像魔法關鍵字一樣,加在query的最後面,就可以成功進行query了。

Day6 .入門級操作#1的操作示範,加在語法的最後面就可以成功執行。

csqlsh:book_sotre >
delete from books where isbn = '9789864764723' ALLOW FILTERING;

對於系統查詢效能來講,使用ALLOW FILTERING並沒有幫助,只是一種強制執行的語法指令。

不過 CASSANDRA/SCYLLA 並沒有對此種做法,抱持全面否定的觀點,原因在於說假設總資料量有1萬筆,你指定的條件符合而撈出的資料會有9000多筆以上,這個全撈後再做篩選的耗損其實不大,這樣子使用也沒什麼不好。

反過來說,假設總資料量有1萬筆,最後撈出符合條件的只有寥寥100筆,那麼用這樣的查詢方式,實在是不好。

所以怎麼去設計和使用查詢條件,是需要開發者細細斟酌的思考點。


上一篇
Day 10. 主鍵(primary key)
下一篇
Day12. 次索引(secondary index)
系列文
scylla 從零開始攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言