Cassandra의 파티션 키, 복합 키 및 클러스터링 키의 차이점은 무엇입니까?


523

다음 key유형 간의 차이점을 이해하기 위해 인터넷 주변의 기사를 읽었습니다 . 그러나 나는 이해하기가 어려워 보인다. 예는 확실히 이해를 돕는 데 도움이됩니다.

primary key,
partition key, 
composite key 
clustering key

23
이 개념에 대한 자세한 설명이 포함 된 이 기사 를 찾았습니다 .
mynkow

이 기사 는 또한 이러한 용어를 명확하게 지적합니다.
duong_dajgja

위에서 공유 한 @duong_dajgja URL이 깨졌습니다. 유효한 / 유용한 URL로 주석을 편집 할 수 있습니까?
realPK

@realPK 어떻게 든 링크가 사라졌습니다. 그러나 quora.com/… 에서 다른 링크를 찾았 습니다 .
duong_dajgja 2

답변:


1171

이것에 대해 많은 혼란이 있습니다. 가능한 한 간단하게 만들 것입니다.

기본 키는 테이블에서 데이터를 검색하는 데 사용되는 하나 이상의 열을 나타내는 일반적인 개념입니다.

기본 키는 단순 하거나 인라인으로 선언 될 수도 있습니다 .

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );

즉, 단일 열로 만들어집니다.

그러나 기본 키는 더 많은 열에서 생성 된 COMPOSITE (일명 COMPOUND ) 일 수도 있습니다 .

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, key_part_two)      
  );

COMPOSITE 기본 키 의 상황에서 키의 "첫 번째 부분"은 PARTITION KEY (이 예에서는 key_part_one 은 파티션 키)이고 키의 두 번째 부분은 CLUSTERING KEY입니다 (이 예에서는 key_part_two ).

파티션과 클러스터링 키는 더 많은 열로 만들 수 있습니다 . 방법은 다음과 같습니다.

 create table stackoverflow_multiple (
      k_part_one text,
      k_part_two int,
      k_clust_one text,
      k_clust_two int,
      k_clust_three uuid,
      data text,
      PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)      
  );

이 이름 뒤에 ...

  • 파티션 키는 사용자의 노드에서 데이터 배포에 대한 책임이 있습니다.
  • 클러스터링 키는 파티션 내 데이터 정렬 할 책임이있다.
  • 기본 키는 받는 사람과 동일 파티션 키 단일 필드 키 테이블 (예에서 단순 ).
  • 복합 / 화합물 키 그냥 다중 열 열쇠

추가 사용 정보 : DATASTAX DOCUMENTATION



간단한 사용법 및 내용 예 간단한 키 :

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

테이블 내용

key | data
----+------
han | solo

COMPOSITE / COMPOUND KEY 는 "와이드 행"을 검색 할 수 있습니다 (즉, 클러스터링 키가 정의되어 있어도 파티션 키만으로 쿼리 할 수 ​​있음)

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';

테이블 내용

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player

그러나 모든 키 (파티션 및 클러스터링)로 쿼리 할 수 ​​있습니다 ...

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;

쿼리 출력

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player

중요 사항 : 파티션 키는을 사용하여 쿼리를 수행하는 데 필요한 최소 지정자 where clause입니다. 다음과 같이 복합 파티션 키가있는 경우

예 : PRIMARY KEY((col1, col2), col10, col4))

최소한 col1과 col2를 모두 전달하여 쿼리를 수행 할 수 있습니다. 이들은 파티션 키를 정의하는 2 개의 열입니다. 쿼리를 만드는 "일반적인"규칙은 최소한 모든 파티션 키 열을 전달해야한다는 것입니다. 각 클러스터링 키를 설정된 순서대로 선택적으로 추가 할 수 있습니다.

유효한 쿼리는 ( 보조 인덱스 제외 )

  • col1과 col2
  • col1과 col2와 col10
  • col1 및 col2 및 col10 및 col 4

유효하지 않습니다 :

  • col1과 col2와 col4
  • col1과 col2를 모두 포함하지 않는 것

도움이 되었기를 바랍니다.


7
내가 쓴 것처럼-<< 질의를 만드는 "일반적인"규칙은 최소한 모든 파티션 키 열을 전달해야한다는 것입니다. 그러면 각 키를 설정된 순서대로 추가 할 수 있습니다. >>-col10이 이전에 정의되었으므로 col4 당신은 또한 col4에 대한 쿼리에 전달해야합니다
카를로 Bertuccini

2
보조 인덱스를 추가 할 수 있지만 "모든"cql 쿼리를 실행할 수 있다는 의미는 아닙니다. 보조 인덱스를 만들기 전에 10 ... 000 ..... :)까지 계산해야합니다.
Carlo Bertuccini

2
보조 인덱스는 로컬 인덱스로 구현되며 클러스터에 분산되지 않습니다. 클러스터의 각 노드는 소유 한 데이터의 보조 인덱스를 저장합니다. 이러한 이유로 sec.index에 대한 쿼리는 클러스터의 모든 노드를 포함 할 수 있습니다
카를로 Bertuccini

5
이 답변 덕분에 며칠 동안 혼란 스러웠습니다. 이제 머리에 데이터 모델을 작성할 수 있습니다.
Roger Dwan

2
와. 당신은 나에게 몇 시간이나 며칠을 구 했어요! 훌륭한 설명 감사합니다.
Andre Garcia

128

수락 된 답변으로 요약 답변을 추가하는 것은 꽤 길다. "행"및 "열"이라는 용어는 Cassandra가 실제로 구현되는 방식이 아니라 CQL과 관련하여 사용됩니다.

  • 기본 키는 행을 고유하게 식별합니다.
  • 복합 키는 복수 열로 형성된 열쇠이다.
  • 파티션 키는 , 행 세트를 찾을 파티션을 즉하기 위해 기본 검색입니다.
  • 클러스터링 키는 파티션 키가 아닌 (그리고 파티션 내에서 순서를 정의) 기본 키의 일부입니다.

예 :

  • 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).

15

cassandra에서 기본 키, 파티션 키, 복합 키, 클러스터링 키의 차이점은 항상 약간의 혼란을 초래합니다. Cassandra 데이터베이스 액세스에는 CQL (Cassandra Query Language)을 사용합니다. 참고 :-답변은 Cassandra의 업데이트 된 버전에 따른 것입니다. 기본 키 :-

cassandra에는 primary Key를 사용하는 두 가지 방법이 있습니다.

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

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

CQL에서 PRIMARY KEY에 대해 열이 정의되는 순서가 중요합니다. 키의 첫 번째 열을 동일한 파티션 키를 공유하는 모든 행 (실제 테이블 에서조차도)이 동일한 물리적 노드에 저장되는 속성이있는 파티션 키라고합니다. 또한 주어진 테이블에 대해 동일한 파티션 키를 공유하는 행에 대한 삽입 / 업데이트 / 삭제는 원자 적으로 수행됩니다. 파티션 키를 형성하는 열을 정의하기 위해 추가 괄호 세트를 사용하여 복합 파티션 키, 즉 여러 열로 구성된 파티션 키를 가질 수 있습니다.

파티셔닝 및 클러스터링 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는 파티션 키이고 checked_at는 cluster_key입니다.

선언에 따라 파티션 키뿐만 아니라 여러 개의 클러스터 키를 가질 수 있습니다.


6
당신은 당신의 소스 (2013 게시물 이상 = 이상) 일부 학점을 준 수 : thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
크리스토프 후씨

11

기본 키 : 파티션 키 (S)로 구성된다 [및 선택적 클러스터링 키 (또는 열)]
파티션 키 : 분할 키의 해시 값은 데이터 저장하는 클러스터 내의 특정 노드를 결정하는 데 사용되는
클러스터링 키 : 데 사용되는 각 파티션 (또는 책임있는 노드와 복제본)의 데이터 정렬

복합 기본 키 : 위에서 말한 것처럼 클러스터링 키는 기본 키에서 선택 사항입니다. 언급되지 않은 경우 간단한 기본 키입니다. 클러스터링 키가 언급되면 복합 기본 키입니다.

복합 파티션 키 : 하나의 열을 파티션 키로 사용하면 광범위한 행 문제 가 발생할 수 있습니다 (사용 사례 / 데이터 모델링에 따라 다름). 따라서 파티션 키는 때때로 둘 이상의 열 조합으로 지정됩니다.

어느 것이 필수인지 혼란 스럽거나 쿼리에서 건너 뛸 수있는 것과 관련하여 Cassandra를 거대한 HashMap으로 상상해보십시오 . 따라서 HashMap에서는 Key가 없으면 값을 검색 할 수 없습니다.
여기서 파티션 키 는 해당 키의 역할을합니다. 따라서 각 쿼리에는이를 지정해야합니다. Cassandra가 없으면 검색 할 노드를 알 수 없습니다. 클러스터링 키를 더 카산드라는 특정 노드를 발견 한 후 쿼리 검색을 축소 (그리고 그것의 복제본)에 도움 특정에 대한 책임 (선택 사항 열) 파티션 키 .


5

간단히 말해서 :

파티션 키 는 행의 식별 에 지나지 않습니다. 대부분의 경우 식별은 단일 열 ( 기본 키 )이고 때로는 여러 열의 조합 ( 복합 파티션 키 )입니다.

클러스터 키인덱싱정렬에 지나지 않습니다 . 클러스터 키는 몇 가지 사항에 따라 다릅니다.

  1. 기본 키 열을 제외하고 where 절에서 사용하는 열

  2. 만약 당신이 매우 큰 기록을 가지고 있다면 어떤 문제에 대해 쉽게 관리 할 수 ​​있도록 날짜를 나눌 수 있습니다. 예를 들어, 카운티 인구 기록이 1 백만 건에 이릅니다. 따라서 쉬운 관리를 위해 상태 및 핀 코드 이후 등을 기준으로 데이터를 클러스터링합니다.


3
파티션 키는 행에 대한 식별이 아니다 ... 동일한 파티션 키가있는 모든 행의 무리 식별
WMAC

1

주목해야 할 것은 관계형 세계 (복합 키)의 유사한 개념보다 많은 것들을 사용할 것입니다.

예-최근에 사용자 그룹 X에 가입 한 마지막 N 명의 사용자를 찾아야한다고 가정합니다.이 경우 어떻게 효율적으로 읽기를 수행 할 수 있습니까? (공식 카산드라 가이드에서 ) :

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 (A)보다 오히려 join_date 은 지난 3 일 동안 조회 할 경우 너무 자주 그 주 같은 해시 따라서 동일한 파티션에서 사용할 수 있는지 - 혼자!


0

Cassandra의 기본 키는 일반적으로 파티션 키와 클러스터링 열의 두 부분으로 구성됩니다.

primary_key ((partition_key), clustering_col)

파티션 키-기본 키의 첫 번째 부분. 파티션 키의 주요 목표는 특정 행을 저장하는 노드를 식별하는 것입니다.

CREATE TABLE phone_book (phone_num int, 이름 텍스트, age int, 도시 텍스트, PRIMARY KEY ((phone_num, name), age);

여기서 (phone_num, name)은 파티션 키입니다. 데이터를 삽입하는 동안 파티션 키의 해시 값이 생성되며이 값은 행으로 들어가야하는 노드를 결정합니다.

4 노드 클러스터를 고려하면 각 노드에는 저장할 수있는 해시 값의 범위가 있습니다. (쓰기) INSERT INTO phone_book VALUES (7826573732, 'Joey', 25, 'New York');

이제 파티션 키의 해시 값은 Cassandra 파티 셔너에 의해 계산됩니다. 예를 들어, hash value (7826573732, 'Joey') → 12이면 이제이 행이 노드 C에 삽입됩니다.

(읽기) SELECT * FROM phone_book WHERE phone_num = 7826573732 및 name = 'Joey';

이제 다시 파티션 키 (7826573732, 'Joey')의 해시 값이 계산되는데,이 경우 읽기가 수행되는 노드 C에 상주하는 12입니다.

  1. 클러스터링 열-기본 키의 두 번째 부분. 클러스터링 열을 갖는 주요 목적은 데이터를 정렬 된 순서로 저장하는 것입니다. 기본적으로 주문은 오름차순입니다.

해결하려는 쿼리에 따라 기본 키에 둘 이상의 파티션 키 및 클러스터링 열이있을 수 있습니다.

primary_key ((pk1, pk2), 열 1, 열 2)


-3

데이터베이스 디자인에서 복합 키는 최소한의 슈퍼 키 세트입니다.

복합 키는 복합 키와 수 퍼키가 아닌 하나 이상의 속성을 포함하는 세트입니다.

주어진 테이블 : EMPLOYEES {employee_id, firstname, surname}

가능한 슈퍼 키는 다음과 같습니다.

{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}

{employee_id}는 유일한 최소 수 퍼키이며 또한 {firstname}과 {surname}이 (가) 고유성을 보장하지 않는 유일한 후보 키입니다. 기본 키는 선택된 후보 키로 정의되며이 예제에는 하나의 후보 키만 있으므로 {employee_id}는 최소 수 퍼키, 유일한 후보 키 및 유일한 기본 키입니다.

복합 키의 전체 목록은 다음과 같습니다.

{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}

복합 키 ({employee_id, firstname})와 수 퍼키 ({surname})가 아닌 속성을 포함하므로 유일한 복합 키는 {employee_id, firstname, surname}입니다.


질문과는 전혀 관련이 없습니다. 일반적인 설명이 아닌 Cassandra와 관련하여 요청 된 주소 키에 대한 답변을 편집하십시오. TY.
realPK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.