2016-07-22 3 views
1

복합 기본 키에서 문자열 (약 6 ~ 7 자 정도)을 고유 키로 사용하려고합니다.Cassandra가 string의 고유 키를 검색하는 방법은 무엇입니까?

나는 성능 여부에 충돌합니다 기본 키에 문자열을 사용하는 경우 인터넷 검색과 더는 카산드라가 고유 키에 검색을위한 해시를 사용한다.

그래서 내가 알고 싶어 (사람이이를 확인하시기 바랍니다)되지 않습니다 발견했다 Cassandra가 고유 키를 검색 할 때 사용하는 기법은 무엇입니까? 또한 카산드라가 충돌의 경우 해싱에서와 같이 충돌이 발생할 가능성이 항상 무엇인지 알고 싶습니다.

카산드라는 파티션 키 작업을 위해 murmur3 해시를 사용합니다. 고유 한 키를 검색 할 때도 같은 방법을 사용합니까? 그렇다면 충돌은 어떨까요?

답변

0

파티션 키 값이 해시 된 후 해당 토큰 범위를 소유 한 노드를 대상으로 사용됩니다. 해시 값은 항상 한 값에 대해 동일하기 때문에 충돌과 같은 것은 없습니다. 동일한 값 파티션 키를 사용하면 기존 파티션에 쓸 것이므로 업데이트로 이어집니다. 삽입 및 업데이트는 모두 upsert라는 동일한 작업입니다. 희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. @Matijia는 파티션 키 충돌에 대해 아무런 문제가 없지만 고유 키 –

1

당신이 복합 키를 언급 한 이래로 당신이 이것과 같은 PK를 가졌다 고 가정 할 때, PRIMARY KEY (PartionKey, StringVal)는 StringVal이 6에서 7 문자이고 C *가 어떻게 효율적으로 기록되는지 알고 싶습니다. 이 PK. 이것이 귀하의 질문이라면 C *가 데이터를 저장하는 방법에 대한 답이됩니다. 이 예에서 주어진 파티션 키에 대한 모든 데이터는 'StringVal'을 정렬 순서로 사용하여 하나의 물리적 행으로 저장됩니다. 따라서 주어진 PartionKey 값에 대해 1 백만 개의 고유 한 'StringVal'을 말하면 노드의 모든 물리적 행 (디스크상의)을 Partionkey의 해시에 의해 결정되고 기본 오름차순으로 정렬됩니다 'StringVal'의 순서. 파티션 키가 아닌 PK의 모든 열은 클러스터링 순서를 결정할 때 '클러스터링'열이라고합니다. 따라서이 예에서 복합 키의 첫 번째 열은 파티션 키이고 두 번째 열은 파티션 키의 모든 레코드에 대한 클러스터링 순서를 결정하는 클러스터링 열입니다. 이제 특정 PK 레코드를 가져 오려면 C *가 기본 키의 오프셋을 인덱스 파일에 저장하므로 (- 열 패밀리의 인덱스 db 파일) PK에 대한 특정 레코드를 가져 오는 것이 매우 효율적입니다 그 위치를 찾는다. 또한 이것은 C이 효율적인 범위 쿼리를 수행하는 것을 허용합니다. 'nnn'> sv < 'mmm'과 같이 'StringVal'범위를 지정하여 파티션 키에 해당하는 실제 행을 얻을 수 있습니다.이 경우 음수 순서 비교가됩니다. 그러나 요점은 디스크와 C *의 특정 순서가 'StringVal'값에 해당하는 다양한 레코드로 상쇄 되었기 때문에 매우 효율적인 검색을 수행 할 수 있다는 것입니다.

+0

의 아키텍처를 알고 싶지만 여전히 카산드라가 문자열에서 검색하는 방법을 얻지 못합니다. 뭔가 해시를 사용합니까? –

+0

감사! 해싱은 PartionKey에만 사용되고 클러스터링 열에는 사용되지 않습니다. 이 유형의 해싱을 일관된 해싱이라고하며 Cassandra는이를 위해 murmer3 파티션을 사용합니다. 해싱 세부 정보 [Consistent Hashing] (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

관련 문제