我是cassandra的新手,我正在尝试更多地了解db引擎的工作原理(特别是cql部分),并将其与mysql进行比较。
考虑到这一点,我尝试了一些查询,但有一个特定的查询我想不出来。从我所读到的信息来看,在cassandra中不可能进行这个查询,但是我想确定是否有一些工作可以解决这个问题。
设想下表[customer],主键=id:
id, name, city, country, email
01, Jhon, NY, USA, jhon@
02, Mary, DC, USA, mary@
03, Smith, L, UK, smith@
.....
我想得到一个清单,显示我有多少客户,我每个国家和订单描述。
在mysql中
SELECT COUNT(Id), country
FROM customer
GROUP BY country
ORDER BY COUNT(Id) DESC
但是在cassandra(cql)中,似乎我不能对不是主键的列进行分组(比如“country”),这周围有没有其他的东西???
2条答案
按热度按时间nuypyhwy1#
在cassandra中构建表时,需要记住的主要事情是根据您计划如何查询它来建模它的主键。在任何情况下,定义
id
因为主键对你要做的事情没有多大帮助。还有,像
GROUP BY
以及ORDER BY
有特殊要求。ORDER BY
特别是非常无用(imo),除非您计划反转排序方向。但不能选择任意列来对数据进行排序。为了解决上面的查询,我将创建一个新表,在
country
,city
,和id
列(按顺序):现在,我将插入行:
笔记:
最后一条消息意味着您正在运行一个查询,但没有分区键所设置的where子句。这意味着cassandra必须检查集群中的每个节点才能为这个查询提供服务。效率很低。
虽然对这个例子有效,
country
因为分区键可能不是分发数据的最佳方式。毕竟,如果大多数客户都在一个特定的国家,那么他们可能会突破最大分区大小的限制。v1uwarro2#
你需要定义一个关于“国家”的二级索引。辅助索引用于使用通常不是查询表的列来查询表。
对于order by,在“id”上定义聚类键。聚类键负责对分区内的数据进行排序。