2

我想制作一个有效的复合键来处理WHERE具有多个条件的查询,例如:

SELECT * FROM playlists 

WHERE 
      album = 'We Must Obey'
      artist = 'Fu Manchu' AND
      title = 'Ojo Rojo'

ORDER BY song_order ASCENDING ALLOW FILTERING

对于这个查询,制作专辑、艺术家和标题二级索引是否有意义?使其中的 3 个二级索引是多余的吗?一个二级索引(在这种情况下最常见的是艺术家列)就足够了吗?

在此处输入图像描述

4

2 回答 2

1

如果您对专辑和标题的大多数查询都带有艺术家的条件,那么我会说艺术家的单个二级索引就足够了,因为艺术家不太可能拥有超过一百张专辑。在这种情况下,对艺术家有 EQ 的查询是非常有选择性的。

如果您的许多查询可能只针对专辑和标题而没有确定艺术家,那么我会说建立三个二级索引是必要的。

于 2013-08-11T04:53:20.587 回答
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));

这将按艺术家(分区键)键入所有条目,还允许您使用专辑和标题缩小结果。请注意,使用复合主键,您可以按从左到右的顺序按一个或多个主键字段进行查询。请注意,这种方法也不按歌曲顺序排序。

另一种解决方法是,如果您确定您将始终按艺术家、专辑和标题进行查询。如果是这种情况,那么您可以将它们全部定义为复合分区键的一部分,如下所示:

PRIMARY KEY ((artist, album, title), song_order);

虽然这需要所有查询中都存在艺术家、专辑和标题,但这将是查询此数据的最快方式。而 song_order 是一个聚类列,因此专辑中歌曲的顺序将被保留。但同样,这一切都取决于它将提供的查询。

于 2014-09-20T13:11:53.940 回答