Cassandra의 파티션 키, 복합 키 및 클러스터링 키의 차이점은 무엇입니까?
다음 key
유형 간의 차이점을 이해하기 위해 인터넷 주변의 기사를 읽었습니다 . 그러나 나는 이해하기가 어려워 보인다. 예는 분명히 이해를 돕는 데 도움이 될 것입니다.
primary key,
partition key,
composite key
clustering key
이것에 대해 많은 혼란이 있습니다. 가능한 한 간단하게 만들 것입니다.
기본 키는 테이블에서 데이터를 검색하는 데 사용되는 하나 이상의 열을 나타내는 일반적인 개념입니다.
기본 키는 단순 하거나 인라인으로 선언 될 수도 있습니다 .
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를 모두 포함하지 않는 것
도움이 되었기를 바랍니다.
수락 된 답변으로 요약 답변을 추가하는 것은 꽤 길다. "행"및 "열"이라는 용어는 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)
.
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입니다.
선언에 따라 파티션 키뿐만 아니라 여러 개의 클러스터 키를 가질 수 있습니다.
기본 키 : 파티션 키 (S)로 구성된다 [및 선택적 클러스터링 키 (또는 열)]
파티션 키 : 분할 키의 해시 값은 데이터 저장하는 클러스터 내의 특정 노드를 결정하는 데 사용되는
클러스터링 키 : 데 사용되는 각 파티션 (또는 책임있는 노드와 복제본)의 데이터를 정렬하십시오.
복합 기본 키 : 위에서 말한 것처럼 클러스터링 키는 기본 키에서 선택 사항입니다. 언급되지 않은 경우 간단한 기본 키입니다. 클러스터링 키가 언급되면 복합 기본 키입니다.
복합 파티션 키 : 하나의 열을 파티션 키로 사용하면 광범위한 행 문제 가 발생할 수 있습니다 (사용 사례 / 데이터 모델링에 따라 다름). 따라서 파티션 키는 때때로 둘 이상의 열 조합으로 지정됩니다.
어느 것이 필수인지 혼란 스럽거나 쿼리에서 건너 뛸 수있는 것과 관련하여 Cassandra를 거대한 HashMap으로 상상해보십시오 . 따라서 HashMap에서는 Key가 없으면 값을 검색 할 수 없습니다.
여기서 파티션 키 는 해당 키의 역할을합니다. 따라서 각 쿼리에는이를 지정해야합니다. Cassandra가 없으면 검색 할 노드를 알 수 없습니다. 클러스터링 키를 더 카산드라는 특정 노드를 발견 한 후 쿼리 검색을 축소 (그리고 그것의 복제본)에 도움 특정에 대한 책임 (선택 사항 열) 파티션 키 .
간단히 말해서 :
파티션 키 는 행을 식별 하는 것에 지나지 않습니다. 대부분의 경우 식별은 단일 열 ( 기본 키 )이며 때로는 여러 열의 조합 ( 복합 파티션 키 )입니다.
클러스터 키 는 인덱싱 및 정렬에 지나지 않습니다 . 클러스터 키는 몇 가지 사항에 따라 다릅니다.
기본 키 열을 제외하고 where 절에서 사용하는 열
당신이 매우 큰 기록을 가지고 있다면 어떤 관리 문제를 쉽게 할 수 있도록 날짜를 나눌 수 있습니다. 예를 들어, 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 만 아니라 join_date 의 해시를 사용해야합니다. 따라서 지난 3 일 동안 쿼리하면 동일한 해시를 공유하므로 동일한 파티션에서 사용할 수 있습니다!
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입니다.
- 클러스터링 열-기본 키의 두 번째 부분. 클러스터링 열을 갖는 주요 목적은 데이터를 정렬 된 순서로 저장하는 것입니다. 기본적으로 주문은 오름차순입니다.
해결하려는 쿼리에 따라 기본 키에 둘 이상의 파티션 키와 클러스터링 열이있을 수 있습니다.
primary_key ((pk1, pk2), 열 1, 열 2)
데이터베이스 디자인에서 복합 키는 최소한의 슈퍼 키 세트입니다.
복합 키는 복합 키와 수 퍼키가 아닌 하나 이상의 속성을 포함하는 세트입니다.
주어진 테이블 : 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}입니다.
'development' 카테고리의 다른 글
요소에 JavaScript의 클래스가 포함되어 있는지 확인 하시겠습니까? (0) | 2020.02.14 |
---|---|
예외를 던질 때 JavaScript 스택 추적을 어떻게 얻을 수 있습니까? (0) | 2020.02.14 |
Java 인터페이스에서 정적 메소드를 정의 할 수없는 이유는 무엇입니까? (0) | 2020.02.14 |
Git 리포지토리의 리모컨 목록? (0) | 2020.02.14 |
배치 파일 실행 후 콘솔의 자동 폐쇄를 방지하는 방법 (0) | 2020.02.14 |