2016-07-22 3 views
1

Я хочу использовать строку (приблизительно около 6-7 символов) как уникальный ключ в составном первичном ключе.Как Кассандра ищет уникальный ключ строки?

Я гугл при использовании строки в первичном ключе ударит производительность или нет, и не обнаружил, что нет, это не будет, как использовать Cassandra хэширования для поиска по уникальному ключу. (Кто-то пожалуйста, проверьте это)

Так что я хочу знать какие методы использует Cassandra для поиска по уникальному ключу, если он использует хэширование, какой алгоритм хеширования он использует? А также хотите знать, что делает Кассандра в случае столкновения, так как при хэшировании всегда есть вероятность столкновения.

Кассандра использует хемер murmur3 для работы с ключом раздела. Используется ли он для поиска уникального ключа? Тогда как насчет столкновения.

ответ

0

Значение ключа раздела хэшируется, а затем используется для таргетинга узла, которому принадлежит этот токен. Столкновение не происходит, поскольку значение хеша всегда одно и то же для одного значения. Если вы используете тот же ключ раздела значений, вы будете записывать в существующий раздел, который приведет к обновлению. Вставка и обновление - это одно и то же действие, называемое upsert. Надеюсь, поможет.

+0

@Matijia спасибо за ваш ответ, я знаю, что столкновение ключей разделов не проблема, но я хочу знать архитектуру уникального ключа –

1

Поскольку вы упомянули составной ключ, поэтому я предполагаю, что у вас есть такой PK, PRIMARY KEY (PartionKey, StringVal), где StringVal имеет 6-7 символов, и я думаю, вы хотите знать, как C * эффективно записывается для это ПК. Если это ваш вопрос, тогда ответ заключается в том, как C * хранит данные. В этом примере все данные для данного ключа разделов сохраняются как одна физическая строка с использованием «StringVal» в качестве порядка сортировки. Итак, если вы скажете 1 миллион уникальных «StringVal» для данного значения PartionKey, то все они будут сохранены как одна физическая строка (на диске) на узле (определяется хешем Partionkey) и отсортированы по умолчанию по возрастанию порядок 'StringVal'. Все столбцы в PK, кроме ключа раздела, называются столбцами «кластеризации», поскольку они определяют порядок кластеризации. Таким образом, в этом примере первым столбцом составного ключа является ключ раздела, а второй столбец - столбец кластеризации, который определяет порядок кластеризации для всех записей для ключа раздела. Теперь, если вы хотите получить определенную запись PK, поскольку C * хранит смещение для первичных ключей в индексных файлах (-Index.db для семейства столбцов), получение определенной записи для ПК очень эффективно, поскольку оно включает искать это место. Также это позволяет C выполнять эффективные запросы диапазона, например, например. вы можете получить кусочек физической строки, соответствующей ключу раздела, указав диапазон «StringVal», например «nnn»> sv < «mmm», который в вашем случае будет лексическим сопоставлением порядка. Но дело в том, что поскольку его в определенном порядке на диске и C * смещается к различным записям, соответствующим значениям «StringVal», он может делать очень эффективные запросы.

+0

хороший ответ, но все же я не понимаю, как Кассандра будет искать строку? он использует хеширование? –

+0

Спасибо! Хеширование используется только для PartionKey, а не для кластеризации столбцов. Этот тип хэширования называется последовательным хэшированием, а для этого Cassandra использует murmer3partitioner. Отметьте это для деталей хэширования [Согласованное Хеширование] (https://docs.datastax.com/en/cassandra/2.0/cassandra/architecture/architectureDataDistributeHashing_c.html). Вы также можете найти эту ссылку полезной [Сложные ключи кластеризации] (https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_compound_keys_c.html) – dwivedialok