2014-09-07 10 views
0

사용자가 다른 사용자의 피드를 볼 수있게하려는 구조입니다. 일을하는 한 가지 방법은 모든 이해 당사자의 피드에 조치를 취하는 것입니다. 사용자 ID는 =하나의 보조 색인으로 읽는 것이 cassandra에서 복수로 읽는 것보다 빠릅니까?

그렇지 않으면 내가 너무 많은 데이터를 쓰는 피할 수 피드에서 이후 선택 같은 쿼리를 초래

나는 이미 내가 할 수있는 읽기를하고있는 중이 야 :

을 경우 사용자 ID 피드에서 선택 IN (친구 목록).

두 번째 천천히? 아직 많은 데이터/클러스터링으로이를 테스트하는 애플리케이션이 없습니다. 응용 프로그램이 단일 노드를 테스트하기위한 코드를 작성하는 데 큰 가치가 없으므로 사용자의 지식을 요청합니다.

답변

1

제목이 정확하고 userid이 보조 색인 인 경우 SELECT/WHERE/IN을 실행하는 것도 불가능합니다. WHERE/IN 절은 기본 키 값과 만 작동합니다. 당신이 보조 인덱스 컬럼에 그것을 사용하는 경우,이 같은 표시됩니다

하지 : 또한

Bad Request: IN predicates on non-primary-key columns (columnName) is not yet supported 

을의 DataStax CQL3 documentation for SELECTIN 사용에 대한 읽을 가치 섹션이있다 IN 사용

인덱스를 사용하지 않을 경우의 권장 사항은 WHERE 절에서 IN 을 사용할 때 적용됩니다. 대부분의 조건에서 WHERE 절의 IN을 사용하는 것은 좋지 않습니다. 일반적으로 많은 노드를 쿼리해야하기 때문에 IN을 사용하면 성능이 저하 될 수 있습니다. 예를 들어 노드 수가 30이고 복제 계수가 3이고 LOCAL_QUORUM의 일관성 수준 인 단일 데이터 센터 클러스터에서 단일 키 쿼리는 두 개의 노드로 전달되지만 쿼리에서 IN 조건을 사용하는 경우, 질의되는 노드 수인 은 키가 토큰 범위에 속하는 에 따라 노드가 최대 20 개까지 더 높습니다.

피드 테이블에있는 카디널리티에 대해 알지 못하면 첫 번째 쿼리의 경우 성능에 대해 추측하기가 어렵습니다. userid이 고유하거나 가능한 값 수가 매우 높으면 해당 쿼리는 제대로 수행되지 않습니다. 반면에, 각 userid에 여러 개의 "피드"가있을 수 있다면 괜찮을 것입니다.

Cassandra 데이터 모델링은 예상 검색어에 대한 데이터 구조를 구축하는 것에 관한 것임을 기억하십시오. 때로는 동일한 데이터에 대해 3 가지 다른 쿼리가있는 경우 동일한 계획을 세 가지 테이블에 중복하는 것이 가장 좋습니다. 그리고 그건 괜찮습니다.

특정 쿼리를 대상으로 테이블을 작성하여이 문제를 해결할 것입니다. 당신이 언급 한 내용을 바탕으로,이처럼 만들 것입니다 :

CREATE TABLE feedsByUserId 
    userid UUID, 
    feedid UUID, 
    action text, 
    PRIMARY KEY (userid, feedid)); 

partitioning keyuserid로 구성된 복합 기본 키를 사용하면 다음 SELECT/WHERE/IN 쿼리가 위에서 언급 한 실행할 수 및 예상 달성 결과.물론, 나는 feedid의 추가가 전체 키를 유일하게 만들 것이라고 가정하고 있습니다. 그렇지 않은 경우 PRIMARY KEY에 추가 필드를 추가해야 할 수 있습니다. 내 예제에서는 또한 useridfeedid이 버전 -4 UUID라고 가정합니다. 그렇지 않은 경우 유형을 적절하게 조정하십시오.

+0

피드 열, 작업, 사용자 ID와 같은 내 열 패밀리를 원하고, 예상 값/큰 값이되기를 희망하는 주어진 사용자 ID에 대한 모든 동작을 선택하십시오. 2 차 키 IN 절에 대해 유감스럽게 생각합니다. CQL과 cassandra로 시작합니다. – arisalexis

+0

@arisalexis 걱정할 필요가 없습니다. 나는 예제 쿼리 테이블을 제공하기 위해 편집을했다. 희망이 도움이! – Aaron

+0

그게 내가 찾고 있던 바로 그거야. – arisalexis

관련 문제