2015-01-14 8 views
1

카산드라에서는 열이 (a,b,c) 인 표가 있습니다. SELECT * FROM {table} WHERE a = ? and b = ?SELECT * FROM {table} WHERE a = ? and c = ?을 쿼리해야합니다.색인을 만들거나 기본 키에 추가하고 새 테이블을 만드시겠습니까?

이 경우 기본 키는 어떻게해야합니까? Cassandra에 전체 파티션 키 및/또는 비 파티션 키가 나열된 순서대로 필요하기 때문에 PRIMARY KEY(a,b)PRIMARY KEY(a,c)의 두 테이블을 만들 수 있습니까? 또는 PRIMARY KEY(a)과 같은 것을 수행하고 bcINDEX을 만들 수 있습니까?

기본적으로 기본 키에는 고유성에 필요한 최소 수의 값만 포함되어 있고이 값에서 적절한 파티션 키를 선택해야합니까? 다른 쿼리를 쿼리해야하기 때문에 기본 키에 다른 열을 추가하면 성능이 향상됩니까?

+0

'제공 한 정보로 대답하기가 어렵습니다. 전체 스키마 및 컬럼 카디널리티 세부 사항을 편집하여 자세히 조사하십시오. 이러한 정보만으로 스키마를 분석 할 수 있습니다. –

답변

2

위에서 언급했듯이 a, b 및 c 열의 카디널리티에 대한 자세한 정보를 제공 한 경우에만 근거가있는 대답을 제공 할 수 있습니다. 또한 키 분할과 클러스터링 키의 의미를 이해하십시오. 이들은 기본 키의 일부이며 디자인에 큰 영향을 미칩니다. 당신이 열 A에 충분한 고유 값이있는 경우

, 당신은 파티션 키를 확인하고 다음과 같은 두 가지 방법에서 하나를 선택할 수 있습니다 : 각 쿼리

CREATE TABLE table1_by_ab (
    a int, b int, c int, 
    PRIMARY KEY (a, b)); 

CREATE TABLE table1_by_ac (
    a int, b int, c int, 
    PRIMARY KEY (a, c)); 

2

1) 별도의 테이블을) 다른 컬럼에 대한 더 자주 쿼리 및 인덱스에 대한 하나 개의 테이블 : 당신이 당신의 쿼리를 실행할 수있는 두 가지 경우 모두

CREATE TABLE table2 (
    a int, b int, c int, 
    PRIMARY KEY (a, b)); 

CREATE INDEX ON table2 (c); 

(A, B)와 (A, C). 일반적으로 2 차 인덱스는 피하는 것이 좋지만 2) (a, c)에 대한 쿼리는 파티션 키 (필드 a)를 미리 선택하므로 보조 인덱스는 단일 노드에서 실행될 수 있으며 성능은 그렇지 않습니다. 나쁜.

CREATE TABLE table3_by_ab (
    a int, b int, c int, 
    PRIMARY KEY ((a, b))); 

CREATE TABLE table3_by_ac (
    a int, b int, c int, 
    PRIMARY KEY ((a, c))); 

희망이 : 당신이 열 A에 충분한 고유 값이없는 경우

는, 당신은 당신이 복합 파티션 키와 테이블, 모두를 복제해야합니다, 그것은 파티션 키 할 수 없습니다 도와 드리겠습니다.

+0

자세한 답변을 보내 주셔서 감사합니다! –

+0

그래서 일반적으로 여러 번 조회 한 것처럼 각 쿼리에 대해 새 테이블을 만드는 것이 좋습니다. 예를 들어,이 상황이 다른 주.에서 조회되는 다섯 개의 매개 변수가있는 표로 확장되었는지 고려하십시오. 동일한 정보를 가지고 있지만 다른 기본 키를 사용하여 이러한 쿼리에 맞게 여러 개의 (3-4) 테이블을 만드는 것이 괜찮습니까? –

+0

마지막 질문 하나 :'SELECT * FROM TABLE WHERE a =? '쿼리와 다른 점은 무엇입니까? 그리고 b =? (a, b, c)'또는'PRIMARY KEY (a, b)'와'c '에 대한'INDEX'와 함께 c =? –