我读到过柱状数据库适合聚合查询和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是一个分区行存储。数据存储在分区中,聚集在一起并作为"行"。它是而不是一个列式数据库。
在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 <= ?;