Bringing together the Apache Cassandra experts from the community and DataStax.

Want to learn? Have a question? Want to share your expertise? You are in the right place!

Not sure where to begin? Getting Started

 

question

qiuzeliang_194033 avatar image
qiuzeliang_194033 asked ·

请问如何获取排序键的最大值?建表时指定排序键顺序逆序对查询性能是否有影响?

例如 表为 create table user_msg (

user_id text,

msg_id bigint,

msg text,

PRIMARY KEY (user_id , msg_id)

);

假定每个分区键下有10w~100w条记录,数据分散在很多个sstables下。

当以排序键顺序建表时,查询语句为: select msg_id from user_msg where user_id='100000' order by msg_id desc limit 1;

当以排序键逆序建表时,查询语句为:select msg_id from user_msg where user_id='100000' limit 1;

这两种方式,逆序建表查询性能更优吗?

通过阅读1官方Cassandra文档的说明,我的理解是在没有指定排序键范围时,需要读每个sstable中的最大排序键,然后这些排序键值进行比较,最终读到最大排序键,则在这种方式下需要读大量sstables。如果这种查询的方式的请求量很大,读多个userid下的msgid, 这种使用场景是否会导致Cassandra 频繁gc, 最终导致Cassandra 节点宕机?

data modelingclustering key
10 |1000 characters needed characters left characters exceeded

Up to 8 attachments (including images) can be used with a maximum of 1.0 MiB each and 10.0 MiB total.

1 Answer

Erick Ramirez avatar image
Erick Ramirez answered ·

如果您打算通过相反的顺序来读取数据,那么我们建议也以相反的顺序存储数据。

CREATE TABLE user_msg (
    ...
    PRIMARY KEY (user_id , msg_id)
) WITH CLUSTERING ORDER BY msg_id DESC;

这是最有效的方法,因为检索数据时Cassandra不必进行任何额外排序。

分散在许多SSTables上的数据在这里没有多大关系。 重要的是按照要查询数据的顺序来存储数据。

4 comments Share
10 |1000 characters needed characters left characters exceeded

Up to 8 attachments (including images) can be used with a maximum of 1.0 MiB each and 10.0 MiB total.

我理解的是排序键的索引信息时存储多个在*-index.db上的,Cassandra的节点上并没有一个*-index.db存储某个分区键下所有排序键的索引信息,那么要知道最大的排序键,则需要读所有*-index.db和sstables才能知道。我的疑问是cassandra怎么知道哪个sstables下的排序键是最大的?

0 Likes 0 · ·

SSTable的Index(*-Index.db)组件存储行键的索引及其在数据文件中的位置。

Cassandra从SSTables中检索所有分区片段,并合并数据。 分区开头的第一个row是最大的msg_id,因为它已按DESC顺序排序。

0 Likes 0 · ·
qiuzeliang_194033 avatar image qiuzeliang_194033 Erick Ramirez ♦♦ ·

您的意思是需要读所有包含分区片段的sstables, 然后在内存中合并成一份数据,读这份数据第一条记录? 那么,如果包含分区片段的sstables有10w+, 这样不会影响到读性能吗?

0 Likes 0 · ·
Show more comments