【问题标题】:Cassandra timeuuid comparisonCassandra timeuuid 比较
【发布时间】:2017-04-04 13:46:46
【问题描述】:

我有一张桌子,

CREATE TABLE log (
    uuid uuid,
    time timeuuid,
    user text,
    ....
    PRIMARY KEY (uuid, time, user)
)  

使用 'org.apache.cassandra.index.sasi.SASIIndex' 在 Log(time) 上创建自定义索引 time_idx;

那我要按时间选择

select * from Log where time > 84bfd880-b001-11e6-918c-24eda6ab1677;

没有返回,如果我使用 equal(=),它将返回。我哪一步做错了?

【问题讨论】:

    标签: cassandra cql timeuuid


    【解决方案1】:

    您需要将 time_idx 索引设为 SPARSE 索引。

    SPARSE 索引旨在提高查询大而密集的数字范围(例如每毫秒插入的数据的时间戳)的性能。如果数据是数字的,具有少量分区键的数百万列值表征数据,并且将对索引执行范围查询,那么 SPARSE 是最佳选择。对于不符合此条件的数值数据,PREFIX 是最佳选择。

    删除 time_idx 并使用以下查询创建

    CREATE CUSTOM INDEX time_idx on Log(time) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = { 'mode': 'SPARSE' };
    

    现在您可以使用不等式 >=、> 和

    限制:SPARSE 索引仅用于数字数据,因此 LIKE 查询不适用。

    还有另一件事是您的表创建不正确。应该是

    CREATE TABLE log (
        uuid uuid,
        time timeuuid,
        user text,
        PRIMARY KEY (uuid, time, user)
    ) 
    

    【讨论】:

    • 谢谢你的回复,但是我看到了这个关于SPARSE模式有一个重要的说明。稀疏意味着对于每个索引值,匹配的行非常少(实际上最多 5 个)。如果匹配的行超过 5 行,则会抛出异常 我的情况可以吗,因为它可能返回超过 5 行?
    • 在我看来时间是一个高基数列 > 高基数是指具有非常不常见或唯一值的列。高基数列值通常是标识号、电子邮件地址或用户名。具有高基数的数据表列的示例是具有名为 USER_ID 的列的 USERS 表。如果它是高基数列,那么你应该使用稀疏
    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 2012-07-01
    • 2011-07-18
    • 1970-01-01
    • 2018-05-13
    • 2018-09-16
    • 2012-07-22
    • 2014-06-05
    相关资源
    最近更新 更多