it-roy-ru.com

Разница между ключом раздела, составным ключом и ключом кластеризации в Cassandra?

Я читал статьи по сети, чтобы понять различия между следующими типами key. Но мне просто трудно это понять. Примеры определенно помогут сделать понимание лучше.

primary key,
partition key, 
composite key 
clustering key
457
brain storm

Добавление избыточного ответа в качестве принятого довольно длинное. Термины "строка" и "столбец" используются в контексте CQL, а не как Cassandra фактически реализовано.

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

Примеры:

  • PRIMARY KEY (a): Ключом раздела является a.
  • PRIMARY KEY (a, b): ключом раздела является a, ключом кластеризации является b.
  • PRIMARY KEY ((a, b)): Ключ составного раздела - (a, b).
  • PRIMARY KEY (a, b, c): ключом раздела является a, составным ключом кластеризации является (b, c).
  • PRIMARY KEY ((a, b), c): Ключ составного раздела - (a, b), ключ кластеризации - c.
  • PRIMARY KEY ((a, b), c, d): Ключ составного раздела - (a, b), ключ составной кластеризации - (c, d).
97
OrangeDog

В cassandra различие между первичным ключом, ключом раздела, составным ключом, ключом кластеризации всегда приводит к некоторой путанице. Поэтому я собираюсь объяснить ниже и соотнести их друг с другом. Мы используем CQL (Cassandra Query Language) для Cassandra доступа к базе данных. Примечание: - Ответ согласно обновленной версии Cassandra. первичный ключ: -

В cassandra есть 2 разных способа использования первичного ключа.

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

В CQL порядок, в котором столбцы определены для PRIMARY KEY, имеет значение. Первый столбец ключа называется ключом раздела, обладающим свойством, согласно которому все строки, совместно использующие один и тот же ключ раздела (даже в самой таблице), хранятся на одном физическом узле. Кроме того, вставка/обновление/удаление в строках, совместно использующих один и тот же ключ разделения для данной таблицы, выполняются атомарно и изолированно. Обратите внимание, что возможно иметь составной ключ раздела, то есть ключ раздела, сформированный из нескольких столбцов, используя дополнительный набор скобок, чтобы определить, какие столбцы образуют ключ раздела.

Разделение и кластеризация Определение ПЕРВИЧНОГО КЛЮЧА состоит из двух частей: Ключа разделения и Столбцы кластеризации. Первая часть отображается на ключ строки механизма хранения, а вторая используется для группировки столбцов в строке.

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

Здесь device_id - это ключ раздела, а selected_at - это ключ cluster_key.

У нас может быть несколько ключей кластера, а также ключ раздела, который зависит от объявления.

13
Big Data Guy

первичный ключ: состоит из ключа (ей) раздела [и необязательных ключей (или столбцов) кластеризации]]
ключ раздела: значение хеша ключа раздела используется для определения конкретного узла в кластере для хранения данных
Ключ кластеризации: Используется для сортировки данных в каждом из разделов (или ответственного узла и его реплик)

составной первичный ключ: Как сказано выше, ключи кластеризации являются необязательными в первичном ключе. Если они не упомянуты, это простой первичный ключ. Если упоминаются ключи кластеризации, это составной первичный ключ.

составной ключ раздела: использование только одного столбца в качестве ключа раздела может привести к проблемы с широкими строками (зависит от варианта использования/моделирования данных). Следовательно, ключ раздела иногда указывается как комбинация нескольких столбцов.

Что касается путаницы, какая из них обязательна , какую можно пропустить и т.д. В запросе, пытаясь представьте Cassandra как гигантскую хэш-карту помогает. Таким образом, в HashMap вы не можете получить значения без ключа.
Здесь ключи раздела играют роль этого ключа. Таким образом, каждый запрос должен быть указан. Без которого Cassandra не будет знать, какой узел искать.
ключи кластеризации (столбцы, которые являются необязательными) помогают еще больше сузить поиск запроса после того, как Cassandra определит конкретный узел (и его реплики), ответственный за это. специфический ключ раздела.

7
dd9chndn

В кратком смысле:

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

Ключ кластера не что иное, как Индексирование & Сортировка. Ключи кластера зависят от нескольких вещей:

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

  2. Если у вас есть очень большие записи, то о том, что касается, я могу разделить дату для удобного управления. Например, у меня есть данные о 1 млн. Записей населения округа. Поэтому для простоты управления я кластеризирую данные на основе состояния и после пин-кода и так далее.

3
Sun

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

Пример - предположим, что вам нужно найти последних N пользователей, которые недавно присоединились к группе пользователей X. Как бы вы делали это эффективно, в этом случае чтение является преобладающим? Вот так (из официального сообщения руководство Кассандры ):

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

Здесь ключ разделения является составным, а ключ кластеризации является объединенным Дата. Причина, по которой ключ кластеризации является датой присоединения, заключается в том, что результаты уже отсортированы (и сохраняется, что делает поиск быстро). Но почему мы используем составной ключ для ключа разделения ? Потому что мы всегда хотим прочитать как можно меньше разделов . Чем помогает join_date ? Теперь пользователи из одной группы и с той же датой присоединения будут находиться в одном разделе! Это означает, что мы всегда будем читать как можно меньше разделов (сначала начните с самого нового, затем перейдите к старому и т.д., А не прыгайте между ними).

На самом деле, в крайних случаях вам также необходимо использовать хэш join_date , а не join_date в одиночку - так что если Вы запрашиваете последние 3 дня, часто те, которые используют один и тот же хэш и, следовательно, доступны из одного раздела!

0
kboom

Первичный ключ в Cassandra обычно состоит из двух частей - ключа раздела и столбцов кластеризации.

primary_key ((partition_key), clustering_col)

Ключ раздела - первая часть первичного ключа. Основная цель ключа раздела - определить узел, в котором хранится конкретная строка.

CREATE TABLE phone_book (номер_телефона int, текст имени, возраст int, текст города, первичный ключ ((номер телефона, имя), возраст);

Здесь (phone_num, name) - ключ раздела. При вставке данных генерируется хеш-значение ключа разделения, и это значение определяет, в какой узел должна войти строка.

Рассмотрим кластер из 4 узлов, каждый узел имеет диапазон значений хеша, которые он может хранить. (Написать) INSERT INTO phone_book VALUES (7826573732, "Joey", 25, "New York");

Теперь хэш-значение ключа раздела вычисляется разделителем Cassandra. скажем, хэш-значение (7826573732, "Joey") → 12, теперь эта строка будет вставлена ​​в Node C.

(Читать) SELECT * FROM phone_book WHERE phone_num = 7826573732 и имя = 'Joey' ';

Теперь снова вычисляется хеш-значение ключа раздела (7826573732, "Joey"), которое в нашем случае равно 12, который находится в Node C, из которого производится чтение.

  1. Кластеризация столбцов - Вторая часть первичного ключа. Основная цель кластеризации столбцов - хранить данные в отсортированном порядке. По умолчанию порядок возрастает.

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

primary_key ((pk1, pk2), col 1, col2)

0
Sumon Saikan