使用ALLOW FILTERING的MATERIALIZED VIEW VS查询

时间:2017-10-08 08:49:33

标签: cassandra cql

我有下表users((username), last_seen),其中last_seen基本上是写时间。表中的记录数量约为1000万。 插入非常简单insert into users (username, last_seen) VALUES ([username], now)

但是我需要通过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
    
  3. 哪个更有效率? AFAIK物化视图不稳定,对性能有影响。

2 个答案:

答案 0 :(得分:1)

  

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'

这在服务器端和客户端都不重要。根据预期的数据大小,可以进一步调整分区键。

希望这有帮助!

答案 1 :(得分:0)

我发现在这种情况下使用SASI Index是最佳选择