Couchbase의 N1QL은 Couchbase Server 4.0에서 처음 도입된 이래로 많은 발전을 거듭해 왔습니다. Couchbase 5.0에서는 성능 측면에서 한 단계 더 발전했습니다. 2017년 3월 Couchbase 5.0 개발자 빌드의 경우, 인덱스 투영 기능에서 N1QL의 성능이 향상되었으며, 다음과 같은 개선 사항이 있습니다. COUNT
그리고 DISTINCT
및 많은 요청을 받은 주문 기준
, LIMIT
및 오프셋
연산자.
그렇다면 이러한 모든 영역을 개선하기 위해 구체적으로 어떤 작업이 이루어졌으며 이러한 변화를 어떻게 활용할 수 있을까요?
인덱스 투영을 예로 들어 보겠습니다. 인덱스를 만들 때 원하는 수의 속성으로 인덱스를 만들 수 있습니다. 예를 들어 다음 인덱스를 예로 들어 보겠습니다:
1 |
기본값(유형, 이름, 성)에 인덱스 idx를 만듭니다; |
위의 명령문은 커버링 인덱스에 기본값
버킷용 유형
, 이름
및 성
속성을 지정할 수 있습니다.
이제 다음과 같은 N1QL 쿼리를 생성하여 다음과 같은 문서 몇 개를 검색한다고 가정해 보겠습니다. idx
인덱스를 생성했습니다:
1 2 3 |
이름 선택 기본값에서 WHERE 유형 = '사람' |
위의 쿼리는 idx
색인을 생성하고 이름
속성을 쿼리합니다. 이러한 방식으로 쿼리하는 개념은 새로운 것은 아니지만, 그 이면에서 일어나는 일은 달라졌습니다. 인덱스에 많은 키가 있더라도 하위 집합, 즉 이 경우에는 두 개의 키에만 관심이 있다는 것을 알 수 있습니다.
그렇다면 무슨 일이 일어나고 있으며 이것이 중요한 이유는 무엇일까요?
이전 버전의 카우치베이스에서는 하위 집합만 사용되더라도 인덱스의 모든 키가 고려되었습니다. 그 결과, 더 많은 네트워크, CPU, 메모리가 필요했습니다. 이제 더 이상 그렇지 않습니다.
그렇다면 인덱스 투영이 일어나고 있는지 어떻게 알 수 있을까요?
다음을 수행하십시오. 설명
를 실행 중인 쿼리에 추가합니다:
1 2 3 |
이름 선택 설명 기본값에서 WHERE 유형 = '사람' |
결과에는 다음과 같은 내용이 표시됩니다. index_projection
다음과 같이 보입니다:
1 2 3 4 5 6 7 8 |
... "index_projection": { "entry_keys": [ 0, 1 ] }, ... |
그리고 entry_keys
속성은 쿼리에 따라 변경됩니다. 예를 들어 다음과 같이 추가하면 어떻게 되나요? 어디
조건으로 설정할 수 있나요?
1 2 3 |
이름 선택 기본값에서 WHERE 유형 = 'person' AND 성 = 'Nic' |
위의 시나리오에서, 우리는 설명
다음과 같은 결과가 표시됩니다:
1 2 3 4 5 6 7 8 9 |
... "index_projection": { "entry_keys": [ 0, 1, 2 ] }, ... |
이제 위의 쿼리는 커버링 인덱스의 모든 키를 사용했기 때문에 인덱스 투영이 아닙니다.
인덱스 투영과 함께 적절한 인덱스를 생성하면 전반적인 성능과 Couchbase Server 클러스터 확장에 큰 도움이 될 수 있습니다.
2017년 3월 빌드에서 개선된 성능은 인덱스 투영뿐이 아니었나요? 맞습니다, 더 있습니다!
이제 count(distinct)
연산을 예로 들어 보겠습니다. 이제 다음 쿼리에서 해당 연산을 사용해 보겠습니다:
1 2 |
선택 카운트 설명(구분 유형) 기본값에서; |
결과에서 다음을 사용하고 있음을 알 수 있습니다. 인덱스 카운트 디스팅트 스캔2
그리고 그것이하는 일은 모든 것을 저장하는 것입니다 유형
를 인덱스에 추가하고 고유 값을 처리합니다. 이 작업은 Couchbase 5.0의 인덱서에서 발생하지만, 이전 버전에서는 N1QL 서비스에서 발생했습니다. 인덱서에서 이 작업을 오프로드함으로써 상당한 성능 향상을 경험할 수 있습니다.
마찬가지로 오프셋
, LIMIT
및 주문 기준
연산자를 사용할 수 있습니다. 다음 쿼리를 예로 들어 보겠습니다:
1 2 3 4 5 6 |
이름 선택 설명 기본값에서 WHERE 유형 = '사람' 이름으로 주문하기 제한 1 오프셋 1; |
여러분은 LIMIT
, 주문 기준
및 오프셋
연산자가 색인기에 나타납니다. 5.0 이전에는 LIMIT
연산자만 인덱서에 표시되었지만 이제는 다른 연산자들도 표시됩니다. 이전 버전의 Couchbase에서는 결과를 오프셋할 경우 N1QL이 X만큼의 결과를 모두 가져오고 오프셋 이전의 모든 결과를 삭제했기 때문에 이것은 큰 승리입니다.
N1QL에 대한 자세한 도움이 필요하면 카우치베이스 개발자 포털 유용한 개발자 문서가 많이 포함되어 있습니다.
" 오프셋, 제한 및 주문 기준" 예제는 다음과 같아야 합니다.
이름 선택 설명
기본값에서
WHERE 유형 = '사람'
이름으로 주문하기
제한 1
오프셋 1;
잘 잡으셨어요! 쿼리를 업데이트했습니다 :-)