我想制作一个有效的复合键,以便在多个条件下运行WHERE
查询,例如:
SELECT * FROM playlists
WHERE
album = 'We Must Obey'
artist = 'Fu Manchu' AND
title = 'Ojo Rojo'
ORDER BY song_order ASCENDING ALLOW FILTERING
对于此查询,制作专辑,艺术家和标题二级索引是否有意义?是否会使其中的3个二级索引多余?单个二级索引(在本例中最常见的是艺术家专栏)是否足够?
答案 0 :(得分:1)
如果您对专辑和标题的大多数查询都会附带艺术家的条件,那么我会说艺术家的单一二级索引就足够了,因为艺术家不太可能拥有超过一百张专辑。在这种情况下,对艺术家有情商的查询非常有选择性。
如果您的许多查询可能仅针对专辑和标题而未识别艺术家,那么我会说建立三个二级索引是必要的。
答案 1 :(得分:0)
Cassandra中的二级索引在低中心基数字段上效果最好,即使在某些情况下也是如此。它们不是为了允许您以许多不同的方式查询表(列族)。解决此问题的最佳方法是为此查询建模特定表。如果我们遵循这些实体的层次结构(艺术家写专辑,专辑有标题),那么创建一个带有复合主键的新表是最有意义的:
CREATE TABLE playlists_by_artist_album_title (
id uuid,
song_order bigint,
album text,
artist text,
song_id uuid,
title text,
PRIMARY KEY (artist, album, title));
这将按艺术家(分区键)键入所有条目,并允许您使用专辑和标题缩小搜索结果范围。请注意,对于复合主键,您可以按从左到右的顺序按一个或多个主键字段进行查询。请注意,此方法也不按song_order排序。
另一种解决方法是,如果你确定你总是会被艺术家,专辑和标题查询。如果是这种情况,那么您可以将它们全部定义为复合分区键的一部分,如下所示:
PRIMARY KEY ((artist, album, title), song_order);
虽然这需要在所有查询中都存在艺术家,专辑和标题,但这将是查询此数据的最快方式。而song_order是一个聚类列,因此将保留相册中歌曲的顺序。但同样,这一切都取决于它将服务的查询。