Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra:具有多个WHERE子句的查询的二级索引_Cassandra_Database Indexes_Secondary Indexes - Fatal编程技术网

Cassandra:具有多个WHERE子句的查询的二级索引

Cassandra:具有多个WHERE子句的查询的二级索引,cassandra,database-indexes,secondary-indexes,Cassandra,Database Indexes,Secondary Indexes,我想制作一个有效的复合键,用于WHERE具有多种条件的查询,例如: SELECT * FROM playlists WHERE album = 'We Must Obey' artist = 'Fu Manchu' AND title = 'Ojo Rojo' ORDER BY song_order ASCENDING ALLOW FILTERING 对于这个查询,创建唱片集、艺术家和标题二级索引有意义吗?将其中三个二级索引设置为冗余索引会吗?一个单

我想制作一个有效的复合键,用于
WHERE
具有多种条件的查询,例如:

SELECT * FROM playlists 

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

ORDER BY song_order ASCENDING ALLOW FILTERING
对于这个查询,创建唱片集、艺术家和标题二级索引有意义吗?将其中三个二级索引设置为冗余索引会吗?一个单一的二级索引(本例中最常见的是艺术家列)就足够了吗


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


如果您的许多查询可能只针对相册和标题,而没有识别艺术家,那么我认为构建三个二级索引是必要的。

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是一个聚类列,因此专辑中歌曲的顺序将被保留。但同样,这完全取决于它将提供的查询