gpt4 book ai didi

sorting - 按 Cassandra 中的任何字段排序

转载 作者:行者123 更新时间:2023-12-03 06:29:23 29 4
gpt4 key购买 nike

我正在研究 cassandra 作为我即将进行的项目的可能解决方案。我研究得越多,我就越常听到这样的说法:对创建表时未设置排序的字段进行排序是一个坏主意。

是否可以对任何字段进行排序?如果对不在集群中的字段进行排序会对性能产生影响,那么性能影响是什么?我需要对表中大约 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 支持的查询类型,以及这些查询返回数据的顺序。

Is it possible to sort on any field?

这是 Cassandra 如何对结果集进行排序的问题:事实并非如此。 Cassandra 查询对应于分区位置,数据从磁盘读取并返回给您。如果读取数据的顺序与在磁盘上排序的顺序相同,则结果集将被排序。另一方面,如果您尝试多键查询或基于索引的查询,它必须跳转到不同的分区,那么它很可能不会以任何有意义的顺序返回。

但是,如果您提前计划,您实际上可以影响数据在磁盘上的排序顺序,然后在查询中利用该顺序。这可以通过称为“聚类列”的建模机制来完成。 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);

通过此表定义,我可以通过 id(分区键)查询特定的播放列表。在每个 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

请注意,行现在按艺术家 排序,然后按专辑 排序。如果我们有来自同一专辑的两首歌曲,那么 song_order 将是下一个。

现在您可能会问“如果我只想按专辑排序,而不是按艺术家排序怎么办?”您可以仅按album 排序,但不能使用此表格排序。您不能跳过 ORDER BY 子句中的集群键。为了仅按专辑(而不是艺术家)排序,您需要设计一个不同的查询表。有时,Cassandra 数据建模会让您多次复制数据,以便能够服务不同的查询...没关系

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

关于sorting - 按 Cassandra 中的任何字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418185/

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