제목이 정확하고 userid
이 보조 색인 인 경우 SELECT/WHERE/IN
을 실행하는 것도 불가능합니다. WHERE/IN
절은 기본 키 값과 만 작동합니다. 당신이 보조 인덱스 컬럼에 그것을 사용하는 경우,이 같은 표시됩니다
하지 : 또한
Bad Request: IN predicates on non-primary-key columns (columnName) is not yet supported
을의 DataStax CQL3 documentation for SELECT는 IN
사용에 대한 읽을 가치 섹션이있다 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 key로 userid
로 구성된 복합 기본 키를 사용하면 다음 SELECT/WHERE/IN
쿼리가 위에서 언급 한 실행할 수 및 예상 달성 결과.물론, 나는 feedid
의 추가가 전체 키를 유일하게 만들 것이라고 가정하고 있습니다. 그렇지 않은 경우 PRIMARY KEY
에 추가 필드를 추가해야 할 수 있습니다. 내 예제에서는 또한 userid
및 feedid
이 버전 -4 UUID라고 가정합니다. 그렇지 않은 경우 유형을 적절하게 조정하십시오.
피드 열, 작업, 사용자 ID와 같은 내 열 패밀리를 원하고, 예상 값/큰 값이되기를 희망하는 주어진 사용자 ID에 대한 모든 동작을 선택하십시오. 2 차 키 IN 절에 대해 유감스럽게 생각합니다. CQL과 cassandra로 시작합니다. – arisalexis
@arisalexis 걱정할 필요가 없습니다. 나는 예제 쿼리 테이블을 제공하기 위해 편집을했다. 희망이 도움이! – Aaron
그게 내가 찾고 있던 바로 그거야. – arisalexis