【问题标题】:"Cannot create index on PRIMARY KEY part" error in Apache Cassandra with CQL3带有 CQL3 的 Apache Cassandra 中的“无法在 PRIMARY KEY 部分创建索引”错误
【发布时间】:2013-07-08 19:49:50
【问题描述】:

我正在关注“Cassandra 专家的 CQL3”(http://www.datastax.com/dev/blog/cql3-for-cassandra-experts#comment-259613) 文章。执行中

CREATE TABLE playlists (
  id uuid,
  title text,
  album text,
  artist text,
  song_id uuid,
  PRIMARY KEY (id, title, album, artist)
);

工作正常。但是在尝试运行时

CREATE INDEX ON playlists(artist);

我收到一个错误:

An error occurred when executing the SQL command:
CREATE INDEX ON playlists(artist)

Cannot create index on PRIMARY KEY part artist
‘CREATE INDEX ON playlists(artist)’

文章说它应该可以正常工作。是错误还是我做错了什么?

我正在运行 Cassandra 1.2.4 并使用 JDBC 1.2.5 驱动程序连接到它。

【问题讨论】:

    标签: cassandra cql cql3


    【解决方案1】:

    您不能在分区键(即复合键的任何列部分)上创建索引,因为它们是自动索引的。 顺便问一下,为什么需要在主键的一部分上创建索引?

    【讨论】:

    • 来自“Cassandra Experts 的 CQL3”:“为了说明这一点,请考虑查询 SELECT * FROM playlists WHERE artist = 'Fu Manchu'。使用目前给出的模式,这需要顺序扫描跨越整个播放列表数据集。但如果我们首先在播放列表(艺术家)上创建索引,Cassandra 可以有效地提取有问题的记录。”
    • 不确定这个事实。似乎有人也问过同样的事情,请参阅第 9 条评论,不幸的是仍未清除。
    • 谷歌搜索几分钟后,现在我可以说这是他们方面的一些误解。请参阅 cassandra 帖子 groups.google.com/forum/#!topic/nosql-databases/8qJmR46gf5I
    • 如果是这样,那就太不幸了。如果我在此示例中理解正确,则 id 是分区键,而复合键的其他组件用于磁盘上的数据集群。分区键定义将存储数据的 Cassandra 节点。我看到的所有查询示例都类似于SELECT song_id FROM playlists WHERE id = '62c36092-82a1-...' AND artist < 'ZZ Top'。这只会搜索一个节点,而我需要搜索整个 Cassandra 集群。我需要有效地运行像SELECT song_id FROM playlists WHERE artist < 'ZZ Top' 这样的查询。
    【解决方案2】:

    为了未来的到来,显然这已在 Cassandra 的后续版本中得到修复。我在 2.0.8.39 和 1.2.13.2 版本中有相同的表,并且创建索引确实有效,前者有效,但后者无效。

    【讨论】:

      猜你喜欢
      • 2022-08-16
      • 1970-01-01
      • 2014-07-12
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多