В чем разница между столбцом кластеризации и вторичным индексом в кассандре

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

В моем конкретном примере использования используется cassandra как система для приема событий, поддерживаемая механизмом аналитики, который интерпретирует событие.

Моя модель включает

  • идентификатор события (ключ раздела)
  • время события (столбец кластеризации)
  • тип события (я не уверен, следует ли использовать столбец кластеризации или вторичный индекс)

Я считаю, что наиболее распространенным сценарием чтения является получение событий за период времени, поэтому время события является столбцом кластеризации. Менее частый сценарий чтения может включать дополнительную фильтрацию запроса события по типу события.

Ответ 1

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

Итак, хороший индекс, который мы уже знаем. До сих пор нет ничего нового в кассандре и ее распределенной природе.

Разделение и кластеризация - это выбор того, как распределяются строки из основной таблицы среди узлов. Это уникально для cassandara, поскольку оно определяет распределение данных. Таким образом, первичный ключ состоит из по меньшей мере одного столбца. Первый столбец первичного ключа используется в качестве ключа раздела. Ключ раздела используется для определения того, какой node для хранения строки. Если первичный ключ имеет дополнительные столбцы, столбцы используются для кластеризации данных по заданному node - данные хранятся в лексикографическом порядке на node путем кластеризации столбцов.

Этот вопрос имеет больше особенностей кластеризации столбцов: Кластеризация ключей в Кассандре

Таким образом, индекс в данном столбце X делает поиск X --> primary key эффективным. Ключ раздела (первый столбец в первичном ключе) определяет, где node строка хранится. Кластерные столбцы (дополнительные столбцы в первичном ключе) определяют, какие строки заказов хранятся в назначенных node.

Итак, ваша интуиция звучит правильно - идентификатор события, по-видимому, гарантирован уникальный, поэтому отлично подходит для создания первичного ключа. Время события - отличный способ упорядочить строки на диске при заданном node.

Если вам никогда не приходилось искать данные по типу событий, например, никогда не было запроса типа SELECT * FROM Events WHERE Type = Warning, тогда вам не нужно добавлять дополнительные индексы, но ваши требования к разделению не изменяются. Индексы позволяют легко обслуживать запросы с разными предикатами. Поскольку вы упомянули, что вы действительно планировали выполнение таких запросов, вы действительно хотите получить индекс в столбце EventType.

Проверьте документацию cassandra: http://www.datastax.com/documentation/cql/3.0/cql/ddl/ddl_compound_keys_c.html

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


 В случае таблицы плейлистов, song_order - это столбец кластеризации. Данные для каждого раздела кластеризуются остальным столбцом или столбцами определения первичного ключа. На физическом node, когда строки для ключа раздела хранятся в порядке, основанном на столбцах кластеризации