Почему cassandra / cql ограничивает использование предложения where в столбце, который не проиндексирован?

#cassandra-2.0 #datastax-java-driver #cqlsh

#cassandra #datastax-java-driver #cqlsh

Вопрос:

В Cassandra 2.0.8 у меня есть следующая таблица:

СОЗДАЙТЕ ТАБЛИЦУ emp (empid int, deptid int, текст first_name, текст last_name, ПЕРВИЧНЫЙ КЛЮЧ (empid, deptid))

когда я пытаюсь выполнить поиск по: «выберите * из emp, где first_name=’John’;»

оболочка cql сообщает:
«Неверный запрос: в предложении by-columns с оператором Equal нет индексированных столбцов»

Я искал проблему, и в каждом месте говорится, что добавляется дополнительный индекс для столбца ‘first_name’.

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

Ответ №1:

Cassandra не поддерживает поиск по произвольному столбцу. Это связано с тем, что для этого потребуется сканирование всех строк, что не поддерживается.

Данные внутренне организованы во что-то, что можно сравнить с HashMap[X, SortedMap[Y, Z]] . Ключ внешней карты — это значение ключа раздела, а ключ внутренней карты — это своего рода конкатенация всех значений столбцов кластеризации и имя некоторого обычного столбца.

Если у вас нет индекса для столбца, вам необходимо указать полный (предпочтительный) или частичный путь к данным, которые вы хотите собрать с помощью запроса. Поэтому вы должны разработать свою схему так, чтобы запросы содержали значение первичного ключа и некоторый диапазон для столбцов кластеризации.

Вы можете прочитать о том, что разрешено, а что нет здесь

Ответ №2:

В качестве альтернативы вы можете создать индекс в Cassandra, но это снизит производительность записи.