使用键和索引进行 Cassandra 建模

Posted

技术标签:

【中文标题】使用键和索引进行 Cassandra 建模【英文标题】:Cassandra modeling with key and indexes 【发布时间】:2014-12-29 00:04:23 【问题描述】:

我有一个“用户”表,每个用户都有很多“项目”,每个项目都有很多“客户”,所以它是多对多的,所以我在不同的表中跟踪客户事件。

问题是我不知道如何选择键和索引,以便查询具有最佳性能。

带键的表:

CREATE TABLE project_clients_events(
    id timeuuid,
    user_id int,
    project_id int,
    client_id text,
    event text,
    PRIMARY KEY ((user_id, project_id), id, client_id)
);

现在每个 (user_id, project_id) 将有超过 100K 的事件,所以我需要能够对结果进行分页:http://www.datastax.com/documentation/cql/3.0/cql/cql_using/paging_c.html

如何对结果进行分组和分页?

谢谢!

【问题讨论】:

【参考方案1】:

让我分两部分回答你的问题。首先是分页,然后是分区键

Cassandra CQL 驱动现在支持自动分页,因此您无需担心设计复杂的 where 子句。

Statement stmt = new SimpleStatement("SELECT * FROM images");
stmt.setFetchSize(100);
ResultSet rs = session.execute(stmt);

// Iterate over the ResultSet here

此链接会有所帮助: http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

决定分区取决于您可能有的查询。例如,如果您的大多数查询使用 user_id 和 project_id(即您的大多数查询仅根据 user_id 和 client_id 获取结果),那么最好将 then 作为分区键的一部分,因为所有这些结果都将放在相同的 Cassandra 列(在同一节点上)并一起获取。

因此,我建议您首先确定查询并相应地选择您的分区键。因为您的性能将取决于查询内容与列在 Cassandra 中的存储方式

这可以帮助您http://www.slideshare.net/DataStax/understanding-how-cql3-maps-to-cassandras-internal-data-structure(幻灯片 45-70)

【讨论】:

我正在使用 php,没有任何东西可以自动分页,CQL 3 以这种方式提供它:datastax.com/documentation/cql/3.0/cql/cql_using/paging_c.html 问题是我希望密钥是 (user_id, project_id) 但怎么能我从最后一个位置继续阅读?

以上是关于使用键和索引进行 Cassandra 建模的主要内容,如果未能解决你的问题,请参考以下文章

cassandra中的主键和索引

cass配置重置怎么改不了

在 cassandra 中使用可能的空值对嵌套数据进行建模

Cassandra 多个键空间或列族?

Cassandra 复合聚类键和排序查询

无法连接到 python 上的 cassandra(使用 cassandra-driver