order by子句不适用于Cassandra查询

时间:2015-12-28 09:53:26

标签: cassandra

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

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

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

3 个答案:

答案 0 :(得分:6)

简单地说,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以这种方式工作,因为它的设计目的是按照磁盘上的排序顺序读取数据。您的分区键按散列标记值排序,这就是未绑定WHERE子句的结果似乎是随机排序的原因。

修改

  

我必须使用state_id列获取数据,并且应该按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_idlayer_position的组合足以唯一标识每一行。因此,我通过添加layer_name作为附加群集密钥来确保唯一性。你可能需要也可能不需要,但我猜你会这样。
  • 我假设使用state_id作为分区键不会表现出未绑定的增长,从而接近Cassandra每个分区20亿个单元的限制。如果是这种情况,您可能需要添加一个额外的分区“bucket。”

答案 1 :(得分:-1)

您无法直接在Cassandra中使用order by

仅当您的分区键受order byEQ限制时,您才可以在群集列上应用IN

答案 2 :(得分:-1)

You can use order by clause in cassandra by creating materilaized view table.