2013-08-11 8 views
2

내가 좋아하는 여러 조건 WHERE 쿼리 작업을 효율적으로 복합 키를 만들고 싶어 여러으로 쿼리에 대한 보조 인덱스 : 그것은 의미가 않습니다이 쿼리카산드라 : 절

SELECT * FROM playlists 

WHERE 
     album = 'We Must Obey' 
     artist = 'Fu Manchu' AND 
     title = 'Ojo Rojo' 

ORDER BY song_order ASCENDING ALLOW FILTERING 

은, 앨범, 아티스트로 만들려면 및 제목 2 차 색인? 그들 중 3 명을 보조 색인으로 만드는 것이 중복 될 수 있습니까? 하나의 보조 색인 (이 경우 가장 많이 사용되는 아티스트 컬럼)으로 충분합니까?

enter image description here

답변

1

앨범 타이틀에 쿼리의 대부분이 아티스트의 조건 올 경우 예술가가 이상이 덜하기 때문에, 나는이 작가에 대한 하나의 보조 인덱스가 충분하다 말할 것 백 앨범. 이 경우 아티스트에 EQ가있는 쿼리는 매우 선택적입니다.

아티스트를 식별하지 않고도 많은 검색어가 앨범과 제목에만 사용될 수있는 경우 3 차 보조 지표를 작성해야한다고 말합니다.

0

카산드라의 보조 색인은 하위 중간 카디널리티 필드에서 가장 잘 작동하며, 특정 상황에서만 최상으로 작동합니다. 테이블 (열 패밀리)을 다양한 방법으로 쿼리 할 수있는 것은 아닙니다. 이 문제를 해결하는 가장 좋은 방법은이 쿼리에 대한 특정 테이블을 모델링하는 것입니다.

CREATE TABLE playlists_by_artist_album_title (
    id uuid, 
    song_order bigint, 
    album text, 
    artist text, 
    song_id uuid, 
    title text, 
    PRIMARY KEY (artist, album, title)); 

이것은 작가 (파티션 키) 모든 항목을 키 입력합니다 : 우리는 이러한 개체의 계층 구조를 따라 경우에 가장 적합한 복합 기본 키와 새 테이블을하게 만드는 (아티스트 앨범 제목이 앨범을 쓰기) 또한 앨범 및 제목으로 결과를 좁힐 수 있습니다. 복합 기본 키를 사용하면 왼쪽에서 오른쪽 순서로 하나 이상의 기본 키 필드로 질의 할 수 있습니다. 이 방법은 song_order별로 정렬하지도 않습니다.

또 다른 방법은 아티스트, 앨범 및 제목별로 항상 검색어를 사용한다는 것을 알고있는 경우입니다. 이런 경우, 당신은 다음과 같이 복합 파티션 키의 일부로 그들 모두를 정의 할 수 있습니다 :

PRIMARY KEY ((artist, album, title), song_order); 

을이 모든 쿼리에서 아티스트, 앨범 및 타이틀의 존재를 필요로하지만,이 것 이 데이터를 쿼리하는 가장 빠른 방법입니다. song_order는 클러스터링 열이므로 앨범의 노래 순서가 유지됩니다. 그러나 다시 말하지만, 그것은 모두 제공 될 질의에 달려 있습니다.