Невозможно создать индекс для ошибки части PRIMARY KEY в Apache Cassandra с CQL3

Я следую "CQL3 для экспертов Cassandra" (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.


person Leon    schedule 08.07.2013    source источник


Ответы (2)


Вы не можете создать индекс для ключа разделов, т.е. для любой части столбца составного ключа, так как они автоматически индексируются. Кстати, зачем нужно создавать индекс на части первичного ключа?

person abhi    schedule 09.07.2013
comment
Из CQL3 для экспертов Cassandra: Чтобы проиллюстрировать это последнее, рассмотрим запрос SELECT * FROM playlists WHERE artist = 'Fu Manchu'. С приведенной до сих пор схемой для этого требуется последовательное сканирование всего набора данных списков воспроизведения. Но если мы сначала СОЗДАЕМ ИНДЕКС ПО спискам воспроизведения (исполнителю), Cassandra может эффективно извлекать рассматриваемые записи. - person Leon; 09.07.2013
comment
не уверен в факте. Похоже, кто-то тоже спрашивал то же самое, см. 9-й комментарий и, к сожалению, до сих пор не очищен. - person abhi; 09.07.2013
comment
После нескольких минут гугления теперь я могу сказать, что это было неправильно истолковано с их стороны. См. сообщение cassandra groups.google.com/forum/#!topic/ базы данных nosql/8qJmR46gf5I - person abhi; 09.07.2013
comment
Если так, то это печально. Если я правильно понимаю, в этом примере 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'. - person Leon; 10.07.2013

Ради будущих прибывших, по-видимому, это было исправлено в более поздних версиях Кассандры. У меня одинаковые таблицы в версиях 2.0.8.39 и 1.2.13.2 и создание индекса работает и в первом, но не во втором.

person idoda    schedule 09.01.2016