2017-10-08 425 views
0

我有以下表users((username), last_seen)其中last_seen基本上是寫時間。表中的記錄數量約爲1000萬。 插入是非常簡單的insert into users (username, last_seen) VALUES ([username], now)MATERIALIZED VIEW VS查詢與允許過濾

但我需要通過last_seen欄查詢(此查詢運行,每分鐘),例如:

select username from users where last_seen < (now - 1 day) 

我有兩個選擇,因爲我看到它:

  1. 使用物化視圖:

    CREATE MATERIALIZED VIEW users_last_seen AS 
    SELECT last_seen, username 
    FROM users 
    WHERE last_seen IS NOT NULL 
    PRIMARY KEY (last_seen, username); 
    

    ,只是查詢

    select username from users_last_seen where last_seen < (now - 1 day) 
    
  2. 查詢用戶表

    select username from users where last_seen < (now - 1 day) ALLOW FILTERING 
    

哪一個更有效? AFAIK實體化視圖不穩定並會影響性能。

回答

0

我發現在這種情況下使用SASI Index是最好的選擇

0

AFAIK物化視圖是不穩定的

在這個時間點,我也這麼認爲。但這不是使用ALLOW FILTERING的原因。如果不是更多,那也同樣糟糕。

我會建議創建另一個表或更改當前結構。

CREATE TABLE IF NOT EXISTS user_status (
    day date, 
    id timeuuid, 
    user text, 
    PRIMARY KEY ((day), id) 
); 

此表格按每天進行分區。您只需要查詢當天的數據並在客戶端程序中準備好您的數據。

select * from user_status where day = '2015-05-03'

這既不能在服務器和客戶端重。根據預期的數據大小,分區鍵可以進一步調整。

希望這會有所幫助!

+0

非常感謝。然而,這並不能真正解決這個問題,因爲'day'是一個參數,它也可以是小時或任何其他時期。因此使用建議的表格不是一個適當的解決方案。 – igx

+0

您總是可以根據參數進行多個查詢。 例如:如果是3天,請進行3次查詢以獲得結果。 通過這種方式,您可以識別Cassandra的分區,並避免完全搜索出現不可預知的性能問題。 – chaitan64arun

+0

我的意思是,我需要的是這樣來查詢: '選擇用戶名其中,last_seen <(現在 - 1小時)' 也 '選擇用戶名從用戶那裏last_seen <(現在 - 1天)' 所以預定'日/小時'是不可能的。我可以按分鐘劃分,但它會創建到很多分區不是嗎? – igx