gpt4 book ai didi

cassandra - order by 子句在 Cassandra 查询中不起作用

转载 作者:行者123 更新时间:2023-12-02 23:35:32 25 4
gpt4 key购买 nike

我使用以下代码创建了一个表格层:

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(<<<EOD
select * from layer ORDER BY layer_position DESC
EOD
);

$result = $session->execute($select);

但是这个查询不起作用。请问有人可以帮助我吗?

最佳答案

简单地说,Cassandra 仅在分区键内强制执行排序顺序。

PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)

在这种情况下,layer_name 是您的分区键。如果您在 WHERE 子句中指定 layer_name,则该 layer_name 值的结果将按 layer_position 排序。

SELECT * FROM layer WHERE layer_name = 'layer1';

您不需要指定 ORDER BY。 ORDER BY 在查询级别真正能做的就是应用不同的排序方向(升序与降序)。

Cassandra 以这种方式工作,因为它被设计为按照磁盘上排序的任何顺序读取数据。您的分区键按哈希标记值排序,这就是未绑定(bind) WHERE 子句的结果看起来是随机排序的原因。

编辑

I have to fetch data using state_id column and it should be order by layer_position.

Cassandra 表针对特定查询进行了优化。虽然这会带来高性能,但缺点是查询灵 active 有限。解决此问题的方法是将数据复制到旨在服务该特定查询的附加表中。

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';

结果将在请求的 state_id 内按 layer_position 排序。

现在我做出了一些您想要调查的假设:

  • 我假设 state_id 是一个很好的分区键。这意味着它具有足够高的基数,可以在集群中提供良好的分布,但又具有足够低的基数,可以返回足够的 CQL 行,从而使排序变得有值(value)。
  • 我假设 state_idlayer_position 的组合不足以足以唯一标识每一行。因此,我通过添加layer_name作为附加聚类键来确保唯一性。您可能需要也可能不需要,但我猜您会的。
  • 我假设使用 state_id 作为分区键不会出现无限制增长,从而接近 Cassandra 每个分区 20 亿个单元的限制。如果是这种情况,您可能需要添加一个额外的分区“存储桶”。

关于cassandra - order by 子句在 Cassandra 查询中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34491215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com