首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Scylla DB中,如何按desc顺序查询记录?

在Scylla DB中,如何按desc顺序查询记录?
EN

Stack Overflow用户
提问于 2022-05-13 04:41:44
回答 1查看 435关注 0票数 1

我在ScyllaDB有一张桌子:

代码语言:javascript
运行
复制
CREATE TABLE myservice.auditlog (
    operatorid text,
    operationtime bigint,
    action text,
    actiontype text,
    appname text,
    entityid text,
    entitytype text,
    operatoripaddress text,
    operatorname text,
    payload text,
    PRIMARY KEY (operatorid, operationtime)
) WITH CLUSTERING ORDER BY (operationtime DESC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
    AND comment = ''
    AND compaction = {'class': 'LeveledCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';
CREATE INDEX entityactid ON myservice.auditlog (entityid);
CREATE INDEX actionname ON myservice.auditlog (action);

我想阅读这个表中的N个最近的条目,因此我将集群顺序定义为DESC。但是,当我使用以下查询查询数据时,仍然可以看到按升序排列的结果:

从myservice.auditlog限制N中选择*;(需要获取的N个记录数)

我的表的主键是(operatorid,操作时间)。当我选择时,数据总是由操作程序先按升序顺序排序,然后才按操作时间排序。但我只想在操作时间前得到所有记录,而不管操作程序是什么。我如何实现同样的目标呢?

EN

回答 1

Stack Overflow用户

发布于 2022-05-16 20:27:41

Scylla中的数据布局(顺便说一句,Cassandra和DynamoDB是相同的),就是您有分区,其中每一个都是 (items)的列表。分区由分区键( operatorid)索引,分区内的行由群集键( operationtime)索引。

关于所有这些数据的顺序,需要注意的一点是:

  1. Inside每个分区,每个行(项)按照集群键进行排序,也就是说,根据operationtime.
  2. But分区本身,它们之间没有按任何可识别的顺序排序。它基本上是一个哈希表(顺序是分区键的哈希函数)。

因此,如果您只扫描一个分区--例如,SELECT * FROM myservice.auditlog WHERE operatorid = 7 --您将得到按照operationtime所需的方式排序的结果。但是,如果使用SELECT * FROM myservice.auditlog扫描整个表,就会以看似随机的顺序获得分区,并且只看到每个分区内的顺序。

使用您的数据模型,不可能通过获取表中的所有数据(来自所有分区),并按时间排序。Scylla并不是以这种方式对其进行排序,而是将您的数据分布在可能的多个节点上,由分区键的哈希函数分发,而不是排序。但是请注意,实际上并不需要对所有数据进行排序--您只需要最新的数据。有一种方法可以达到这个目的:

要实现您想要的结果,您可能需要以不同的方式组织数据。例如,假设分区键不是operatorid,而是当前时间(比方说)一个小时的分辨率。例如,现在是1小时,下一小时是2小时,明天是24小时,以此类推。要读取最新的数据,如果现在是123小时,您只需从分区123读取数据,然后使用该限制从单个分区读取最新的数据。如果您正处于一个小时的边缘,您可能需要从两个分区进行读取--但不需要像最初尝试的那样扫描整个数据库。

最后,您可能仍然希望operatorid也是一个键,因为您需要将operatorid=1中的最新数据与operator=2的最新数据分开来获取。还有一个简单的方法:您可以有一个复合分区键--分区键可以是(operatorid, hour)。扫描分区WHERE operatorid=1 AND hour=123将为您提供该操作程序的最新数据。

这类数据模型被称为时间序列,Scylla对它有相当好的支持,包括特殊的压缩策略(时间窗口压缩策略)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72224544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档