2017-10-08 195 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