2017-03-03 119 views
2

我有一個表,如下卡桑德拉允許過濾

CREATE TABLE test (
day int, 
id varchar, 
start int, 
action varchar, 
PRIMARY KEY((day),start,id) 
); 

我想運行此查詢

Select * from test where day=1 and start > 1475485412 and start < 1485785654 
and action='accept' ALLOW FILTERING 

難道這允許過濾的高效?

我期待的是卡桑德拉將在此爲了

1. By Partitioning column(day) 
2. By the range column(start) on the 1's result 
3. By action column on 2's result. 

過濾器,這樣能夠過濾不會對這個查詢一個不錯的選擇。

如果where子句中有多個過濾參數,而非索引列是最後一個,那麼過濾器將如何工作? 請解釋。

回答

0

一般允許過濾效率不高。

但是最終取決於你要讀取的數據的大小(cassandra必須使用允許過濾)以及從中提取數據的大小。

在你的情況卡桑德拉不需要濾波高達:

  • 由範圍柱(開始)對1的結果
  • 正如你提及。但在此之後,它將依靠過濾來搜索您在查詢本身允許的數據。

    現在,請注意以下事項

    如果表中包含例如100萬行,其中95%的請求的值,查詢仍然會比較有效,你應該使用允許過濾的。另一方面,如果您的表包含1百萬行並且只有2行包含所請求的值,那麼您的查詢效率極低。 Cassandra將會加載999,998行。如果經常使用查詢,最好在time1列上添加一個索引。

    所以先確保這一點。如果它對您有利,請使用FILTERING。 否則,在「操作」中添加二級索引將是明智之舉。

    PS:有一些小的編輯。

    +1

    我在不同的問題上閱讀了同樣的答案。這不是這個問題的答案。如果您知道,請詳細說明查詢的工作方式。 – Bharathi

    +0

    我不知道那個問題,但是我在這個舊的[datastax doc](https://www.datastax.com/dev/blog/allow-filtering-explained-2)上閱讀了這個問題。看看它。 雖然我仍然認爲我的答案解釋得很好。但是,如果您發現其他情況,請在此提及。也會清除我的錯誤觀念(如果有的話)。謝謝! – r005t3r

    +0

    感謝您的更新。我知道ALLOW FILTERING將掃描整個列系列。但是這裏的問題是,如果where子句中有多個過濾參數,而非索引列是最後一個,那麼過濾器將如何工作?請閱讀該問題,並告知我是否需要進行任何編輯以獲得更好的理解。 – Bharathi

    2

    這是否允許過濾效率?

    當您編寫「this」時,您的意思是在您的查詢和模型的上下文中,但是ALLOW FILTERING查詢的效率主要取決於要篩選的數據。除非你顯示一些真實的數據,否則這是一個很難回答的問題。

    我期待的是卡桑德拉將在此階濾波器...

    啊,這是會發生什麼。然而,在查詢中包含一個ALLOW FILTERING子句通常意味着一個糟糕的表設計,那就是你沒有遵循一些關於Cassandra建模的指導(特別是「一個查詢< - >一個表」)。

    作爲一個解決方案,我會提示你要包括在聚集鍵的action場只是start場之前,修改你的表定義:

    CREATE TABLE test (
    day int, 
    id varchar, 
    start int, 
    action varchar, 
    PRIMARY KEY((day),action,start,id) 
    ); 
    

    然後你就會重寫查詢沒有任何允許過濾的條款:

    SELECT * FROM test WHERE day=1 AND action='accept' AND start > 1475485412 AND start < 1485785654 
    

    只具有輕微問題,如果一個創紀錄的「開關」 action值,你不能在單012進行更新字段(因爲它現在是集羣密鑰的一部分),因此您需要使用舊的action值執行刪除操作,並使用正確的新值插入它。但是如果你有Cassandra 3.0+,所有這些都可以在新的Materialized View實現的幫助下完成。有一個look at the documentation進一步的信息。

    +0

    如果查詢將按照我所說的順序掃描磁盤,那麼允許過濾不會是錯誤的選擇權。因爲它僅過濾有限數量的數據。 – Bharathi

    +0

    @Bharathi:你想掃描墓碑嗎?我們對您的數據一無所知,所以這裏的一般建議是「不要使用ALLOW FILTERING」,但如果您認爲自己有一小部分記錄,請繼續使用它。畢竟,使用大腦絕對是在卡桑德拉模型的最佳方式... – xmas79

    +0

    我只是想了解允許過濾。我的使用案例與我在這裏陳述的完全不一樣,我不能公開表達。我想知道,如果cassandra按照我所述的順序進行過濾,那麼不會擔心它要掃描的數據量。 – Bharathi