Cassandra适合聚合查询吗?



我读到过柱状数据库适合聚合查询和Cassandra是一个柱状数据库。我试图在Cassandra中使用计数(对于特定分区的值'between'或'>=')。这是性能密集型的吗?

认为Cassandra是列式数据库是一个常见的误解。我想它来自于古老的术语"列族"。为表。数据存储在包含键值对的列的行中,这就是为什么表过去被称为列族。

与传统关系数据库的主要区别是Cassandra表可以是二维的(每条记录只包含一行)或多维的(每条记录可以包含一行或多行)。

另一方面,列式数据库翻转二维表,使数据存储在列中而不是行中,特别针对分析类型的查询(如聚合)进行了优化——这不是Cassandra。

回到你的问题,对于大多数数据模型来说,计算单个分区内的行是可以的。关键是将查询限制为一个分区,例如:

SELECT COUNT(some_column) FROM table_name
WHERE pk = ?

也可以对范围查询中的行进行计数,只要它们被限制在一个分区中,例如:

SELECT COUNT(some_column) FROM table_name
WHERE pk = ?
AND clustering_col >= ?
AND clustering_col <= ?

如果你不将查询限制到单个分区,它可能适用于(a)非常小的数据集和(b)节点数量非常少的集群,但它不会随着(c)数据集的增长和(d)节点数量的增加而扩展。我在这篇文章中解释了为什么在Cassandra中执行COUNT()这样的聚合是不好的——https://community.datastax.com/questions/6897/。

这并不是说Cassandra不适合。如果您的主要用例是为OLTP工作负载存储实时数据,Cassandra是一个不错的选择。对于分析查询,您只需要使用其他软件,如Apache Spark,因为Spark - Cassandra -连接器将优化到Cassandra的查询。干杯!

Cassandra是一个分区行存储。数据存储在分区中,聚集在一起并作为"行"。它是而不是一个列式数据库。

在Cassandra上使用聚合查询执行计数的性能不佳。尝试是性能密集型的,直到协调器节点超时查询。

如果这是一个你需要解决的用例,另一个数据库将是更好的选择。

添加到@aaron的响应中,如果您在分区内仅执行聚合操作,则可能没有问题。例如,

让我们假设您的表模式如下:

CREATE TABLE IF NOT EXISTS keyspace_name.table_name (
partition_key1 some_type,
partition_key2 some_type,
clustering_key1 some_type,
clustering_key2 some_other_type,
regular_column1 some_type,
...
regular_columnN some_type,
PRIMARY KEY ((partition_key1, partition_key2), clustering_key1, clustering_key2)
) WITH CLUSTERING ORDER BY(ck1 DESC, ck2 DESC)
AND ...;

为了提高性能,可以执行以下聚合查询,

SELECT COUNT(some_regular_column) FROM keyspace_name.table_name WHERE partition_key1 = ? AND partition_key2 = ? AND clustering_key1 >= ? AND clustering_key2 <= ?;

相关内容

  • 没有找到相关文章

最新更新