我在ScyllaDB有一张桌子:
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,操作时间)。当我选择时,数据总是由操作程序先按升序顺序排序,然后才按操作时间排序。但我只想在操作时间前得到所有记录,而不管操作程序是什么。我如何实现同样的目标呢?
发布于 2022-05-16 20:27:41
Scylla中的数据布局(顺便说一句,Cassandra和DynamoDB是相同的),就是您有分区,其中每一个都是行 (items)的列表。分区由分区键( operatorid
)索引,分区内的行由群集键( operationtime
)索引。
关于所有这些数据的顺序,需要注意的一点是:
operationtime
.因此,如果您只扫描一个分区--例如,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对它有相当好的支持,包括特殊的压缩策略(时间窗口压缩策略)。
https://stackoverflow.com/questions/72224544
复制相似问题