在Cassandra中按任意字段排序

6
我正在研究Cassandra作为我的即将进行的项目可能解决方案。越是研究,我就越听说,在表创建时未设置排序的字段上进行排序是一个坏主意。
是否可以在任何字段上进行排序?如果在群集中未排序的字段上进行排序会产生性能影响,那么这种性能影响是什么?我需要在该表中对大约200万条记录进行排序。
1个回答

14

在Cassandra中,对于没有设置排序的字段进行排序并不可行。Cassandra需要基于查询的建模方法,包括排序顺序。您需要提前决定想要支持哪些查询以及这些查询返回数据的顺序。

如果您事先规划好,可以使用一种称为“聚簇列”的建模机制来影响数据的磁盘排序顺序,然后在查询中利用该顺序。但是,聚簇列只在单个分区内有效。

具体实现方法可以参考DataStax文档中的例子

CREATE TABLE playlists (
  id uuid,
  artist text,
  album text,
  title text,
  song_order int,
  song_id uuid,
  PRIMARY KEY ((id),song_order))
WITH CLUSTERING ORDER BY (song_order ASC);

通过这个表定义,我可以通过id(分区键)查询特定的playlist。在每个id中,数据将按照song_order排序返回:

SELECT id, song_order, album, artist, title 
FROM playlists WHERE id = 62c36092-82a1-3a00-93d1-46196ee77204
ORDER BY song_order DESC;

id                                   | song_order | album                 | artist         | title
------------------------------------------------------------------------------------------------------------------
62c36092-82a1-3a00-93d1-46196ee77204 | 4          | No One Rides For Free |      Fu Manchu |             Ojo Rojo    
62c36092-82a1-3a00-93d1-46196ee77204 | 3          |             Roll Away | Back Door Slam |  Outside Woman Blues
62c36092-82a1-3a00-93d1-46196ee77204 | 2          |          We Must Obey |      Fu Manchu |     Moving in Stereo
62c36092-82a1-3a00-93d1-46196ee77204 | 1          |          Tres Hombres |         ZZ Top |            La Grange

在这个例子中,如果我只需要指定一个 ORDER BY 来切换排序方向。由于行以 ASC 升序存储,我需要指定 DESC 以按 DESC 降序查看它们。 如果我满意以 ASC 升序的方式获取行,我根本不需要指定 ORDER BY

但是,如果我想按艺术家或专辑排序怎么办?由于一个艺术家可以有多个专辑(对于此示例),我们将修改 PRIMARY KEY 定义如下:

PRIMARY KEY ((id),artist,album,song_order)

运行上述相同的查询(去掉 ORDER BY),会产生以下输出:

SELECT id, song_order, album, artist, title 
FROM playlists WHERE id = 62c36092-82a1-3a00-93d1-46196ee77204;

id                                   | song_order | album                 | artist         | title
------------------------------------------------------------------------------------------------------------------
62c36092-82a1-3a00-93d1-46196ee77204 | 3          |             Roll Away | Back Door Slam |  Outside Woman Blues
62c36092-82a1-3a00-93d1-46196ee77204 | 4          | No One Rides For Free |      Fu Manchu |             Ojo Rojo    
62c36092-82a1-3a00-93d1-46196ee77204 | 2          |          We Must Obey |      Fu Manchu |     Moving in Stereo
62c36092-82a1-3a00-93d1-46196ee77204 | 1          |          Tres Hombres |         ZZ Top |            La Grange

注意现在行按照 artist,然后是 album 的顺序排序。如果我们有两首歌来自同一张专辑,那么 song_order 将是下一个排序依据。

现在你可能会问,“如果我只想按照 album 而不是 artist 排序怎么办?”你可以只按照 album 排序,但并非使用此表格。在 ORDER BY 子句中不能跳过聚集键。为了仅按照 album(而不是 artist)排序,您需要设计一个不同的查询表。有时,Cassandra 数据建模需要您将数据复制几次,以便能够服务不同的查询......这很正常

有关如何构建数据模型并利用聚集顺序的更多详细信息,请查看PlanetCassandra上的这两篇文章:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接