我使用以下代码创建了一个表层:
CREATE TABLE layer ( layer_name text, layer_position text, PRIMARY KEY (layer_name, layer_position) ) WITH CLUSTERING ORDER BY (layer_position DESC)
我使用以下查询以降序(层)从图层表中获取数据:
$select = new Cassandra\SimpleStatement(<<execute($select);
但是这个查询不起作用.请有人帮帮我吗?
简而言之,Cassandra仅在分区键中强制执行排序顺序。
PRIMARY KEY (layer_name, layer_position) ) WITH CLUSTERING ORDER BY (layer_position DESC)
在这种情况下,layer_name
是您的分区键。如果您layer_name
在WHERE子句中指定,则该值的结果layer_name
将按排序layer_position
。
SELECT * FROM layer WHERE layer_name = 'layer1';
您无需指定ORDER BY。在查询级别上,ORDER BY真正能做的就是应用不同的排序方向(升序还是降序)。
Cassandra以这种方式工作,因为它旨在读取数据在磁盘上排序的顺序。您的分区键按哈希令牌值排序,这就是为什么未绑定WHERE子句的结果似乎是随机排序的。
编辑
我必须使用
state_id
column 获取数据,并且应该按排序layer_position
。
Cassandra表针对特定查询进行了优化。虽然这导致高性能,但缺点是查询灵活性受到限制。解决此问题的方法是将您的数据复制到旨在服务该特定查询的其他表中。
CREATE TABLE layer_by_state_id ( layer_name text, layer_position text, state_id text, PRIMARY KEY (state_id, layer_position, layer_name) ) WITH CLUSTERING ORDER BY (layer_position DESC, layer_name ASC);
该表将允许如下查询工作:
SELECT * FROM layer WHERE state_id='thx1138';
结果将layer_position
在请求的范围内排序state_id
。
现在,我做出了两个假设,您将要研究:
我假设这state_id
是一个很好的分区键。这意味着它具有足够高的基数,可以在群集中提供良好的分布,但是具有足够低的基数,可以返回足够的CQL行,因此值得进行排序。
我假设的组合state_id
以及layer_position
是不是足以唯一标识每一行。因此,我通过添加layer_name
作为其他聚类键来确保唯一性。您可能需要也可能不需要,但是我猜测您会。
我假设将其state_id
用作分区键不会出现无限增长,从而接近Cassandra每个分区20亿个单元的限制。在这种情况下,您可能需要添加一个额外的分区“ bucket”。