如何在Cassandra中高效地划分仅索引表?

cgh8pdjw  于 2022-09-27  发布在  Cassandra
关注(0)|答案(1)|浏览(126)

我需要创建一个只应存储一对值(foreign_id, some_string)的追加表。foreign_id值的数量有限(比如说100-10 000),some_string的数量为10百万(它们可能不会在foreign_ids之间均匀分布)
我只关心表中是否存在给定的(foreign_id, some_string)对。
对这个表进行分区的最有效方法(当涉及到查询响应时间时)是什么?
我很确定创建主键PRIMARY KEY ((foreign_id), some_string)是个坏主意,因为单个分区很容易超出100 MB,这是不推荐的AFAIK。
我应该简单地按foreign_idsome_string对表进行分区吗?还是这种方法有问题?

ejk8hzay

ejk8hzay1#

Cassandra中数据建模的基本原理是——针对每个应用程序查询,设计一个针对该查询进行优化的表。它与传统关系数据库中的数据建模完全相反。
不要担心如何将数据存储在表中,而是关注应用程序所需的查询,因为应用程序查询是决定如何优化表的读取的关键方面。
看看您的陈述:
我只关心表中是否存在给定的(foreign_id, some_string)对。
我的理解是,您的应用程序查询大致如下:
“ID X和字符串Y是否存在?”
这意味着您应该通过ID和字符串对表进行分区:

CREATE TABLE tbl_by_id_string (
    foreign_id text,
    some_string text,
    exists boolean,
    PRIMARY KEY ((foreign_id, some_string))
)

应用程序查询的等效CQL查询是:

SELECT exists FROM tbl_by_id_string WHERE foreign_id = ? AND some_string = ?

此设计针对您的应用程序查询进行了优化,完全消除了您对大分区的顾虑,因为表中的每个分区只会有一行,并且永远不会超过一行。
此外,您可以有数十亿个ID+字符串的组合,使用这种设计,它们将均匀分布在集群中的节点上。干杯

相关问题