是否可以在任何字段上进行排序?如果在群集中未排序的字段上进行排序会产生性能影响,那么这种性能影响是什么?我需要在该表中对大约200万条记录进行排序。
在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上的这两篇文章: