具有允许过滤的物化视图 VS 查询

MATERIALIZED VIEW VS query with ALLOW FILTERING

我有以下 table users((username), last_seen) 其中 last_seen 基本上是 writetime 。 table 中的记录数约为 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. 查询用户table

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

哪个效率更高? AFAIK 实体化视图是 unstable 并且对性能有影响。

AFAIK materialized view is unstable

此时此刻,我也是这么想的。但这不是使用 ALLOW FILTERING 的理由。如果不是更多,它同样糟糕。

我建议创建另一个 table 或更改当前结构。

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

这个table是按天划分的。您将只需要查询当天的数据并在客户端程序上准备您的数据。

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

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

希望对您有所帮助!

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