按 Cassandra 中的任何字段排序
Order By any field in Cassandra
我正在研究 cassandra 作为我即将开展的项目的可能解决方案。我研究得越多,我就越听说在创建 table 时未设置排序的字段上进行排序是个坏主意。
是否可以对任何字段进行排序?如果对不在集群中的字段进行排序会产生性能影响,那性能影响是什么?我需要在 table.
中对大约 200 万条记录进行排序
I keep hearing that it is a bad idea to sort on fields that is not setup for sorting when the table was created.
与其说这是个坏主意,不如说是坏主意。让 Cassandra 按任意列对数据进行排序真的是不可能的。 Cassandra 需要一种基于查询的建模方法,这也适用于排序顺序。您必须提前 决定您希望 Cassandra 支持的查询类型,以及这些查询 return 其数据的顺序。
Is it possible to sort on any field?
这是 Cassandra 对结果集排序的方式:事实并非如此。 Cassandra 查询对应于分区位置,数据从磁盘读取并 returned 给你。如果数据以与在磁盘中排序相同的顺序读取,则结果集将被排序。另一方面,如果您尝试一个多键查询或一个基于索引的查询,它必须跳转到不同的分区,很可能它不会按任何有意义的顺序 returned。
但如果您提前计划,您实际上可以影响数据在磁盘上的排序顺序,然后在您的查询中利用该顺序。这可以通过称为 "clustering column." 的建模机制来完成,Cassandra 将允许您指定多个集群列,但它们仅在单个分区内有效。
那是什么意思呢?拿this example from the DataStax documentation.
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);
有了这个 table 定义,我可以通过 id
(分区键)查询特定的 playlist
。在每个 id
中,数据将按 song_order
:
排序 return
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
将是下一首。
所以现在你可能会问 "what if I just want to sort by album
, and not artist
?" 你可以只按 album
排序,但不能用这个 table。您不能跳过 ORDER BY 子句中的聚簇键。为了仅按 album
(而不是 artist
)排序,您需要设计一个不同的查询 table。有时 Cassandra 数据建模会让您多次复制数据,以便能够处理不同的查询...没关系。
有关如何在利用聚类顺序的同时构建数据模型的更多详细信息,请查看 PlanetCassandra 上的这两篇文章:
- Getting Started With Time Series Data Modeling - 帕特里克麦克法丁
- We Shall Have Order! - 免责声明 - 我是作者
我正在研究 cassandra 作为我即将开展的项目的可能解决方案。我研究得越多,我就越听说在创建 table 时未设置排序的字段上进行排序是个坏主意。
是否可以对任何字段进行排序?如果对不在集群中的字段进行排序会产生性能影响,那性能影响是什么?我需要在 table.
中对大约 200 万条记录进行排序I keep hearing that it is a bad idea to sort on fields that is not setup for sorting when the table was created.
与其说这是个坏主意,不如说是坏主意。让 Cassandra 按任意列对数据进行排序真的是不可能的。 Cassandra 需要一种基于查询的建模方法,这也适用于排序顺序。您必须提前 决定您希望 Cassandra 支持的查询类型,以及这些查询 return 其数据的顺序。
Is it possible to sort on any field?
这是 Cassandra 对结果集排序的方式:事实并非如此。 Cassandra 查询对应于分区位置,数据从磁盘读取并 returned 给你。如果数据以与在磁盘中排序相同的顺序读取,则结果集将被排序。另一方面,如果您尝试一个多键查询或一个基于索引的查询,它必须跳转到不同的分区,很可能它不会按任何有意义的顺序 returned。
但如果您提前计划,您实际上可以影响数据在磁盘上的排序顺序,然后在您的查询中利用该顺序。这可以通过称为 "clustering column." 的建模机制来完成,Cassandra 将允许您指定多个集群列,但它们仅在单个分区内有效。
那是什么意思呢?拿this example from the DataStax documentation.
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);
有了这个 table 定义,我可以通过 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
将是下一首。
所以现在你可能会问 "what if I just want to sort by album
, and not artist
?" 你可以只按 album
排序,但不能用这个 table。您不能跳过 ORDER BY 子句中的聚簇键。为了仅按 album
(而不是 artist
)排序,您需要设计一个不同的查询 table。有时 Cassandra 数据建模会让您多次复制数据,以便能够处理不同的查询...没关系。
有关如何在利用聚类顺序的同时构建数据模型的更多详细信息,请查看 PlanetCassandra 上的这两篇文章:
- Getting Started With Time Series Data Modeling - 帕特里克麦克法丁
- We Shall Have Order! - 免责声明 - 我是作者