Couchbase 5.0의 안정적인 릴리스가 임박했으므로 N1QL 기술과 함께 제공되는 성능 및 기능 개선 사항 중 일부를 다시 살펴보는 것도 좋은 생각입니다.
그렇다면 성능과 관련하여 어떤 개선이 이루어졌을까요?
N1QL의 성능 향상
인덱스 투영을 예로 들어 보겠습니다. 인덱스를 만들 때 원하는 수의 속성으로 인덱스를 만들 수 있습니다. 예를 들어 다음 인덱스를 예로 들어 보겠습니다:
|
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 및 인덱싱 기능 개선에 대한 주제로 넘어가겠습니다.
간소화된 배열 인덱싱
Couchbase Server 4.5에는 배열 인덱싱 기능이 추가되었습니다. 다음 샘플 문서를 예로 들어보겠습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "type": "사람", "이름": "닉", "성": "라보이", "소셜 미디어": [ { "type": "트위터", "url": "https://www.twitter.com/nraboy" }, { "유형": "웹사이트", "url": "https://www.thepolyglotdeveloper.com" } ] } |
새로운 배열 인덱스 구문
Couchbase 5.0 이전에는 다음에서 찾은 배열 요소를 인덱싱하려면 소셜 미디어 와 같은 인덱스를 작성해야 합니다:
|
1 2 3 |
인덱스 만들기 ON `기본값` ( `소셜 미디어`에서 미디어에 대해 배열 미디어를 구분합니다. 끝 ) WHERE 유형 = '사람'; |
위의 예에서 FOR 연산자가 배열 인덱싱에 필요했습니다. Couchbase Server 5.0에서는 훨씬 더 간소화된 구문이 있습니다. 다음을 통해 동일한 인덱스를 생성할 수 있습니다:
|
1 2 3 |
인덱스 만들기 ON `기본값` ( 구별 `소셜 미디어` ) WHERE 유형 = "사람"; |
인덱스가 작동하는지 확인하려면 다음 N1QL 쿼리를 실행하면 됩니다:
|
1 2 3 |
설명 선택 * 기본값에서 WHERE type = 'person' 그리고 `social-media`의 모든 미디어가 media.type = 'website'를 만족하는 경우 END; |
결과를 살펴볼 때 설명 를 사용하면 ism 인덱스를 생성합니다.
이제 간소화된 구문이 존재한다고 해서 배열 인덱싱 시 이전 구문을 사용할 수 없다는 의미는 아닙니다. 다음은 이전 구문이 여전히 유효한 이유를 보여주는 완벽한 예시입니다:
|
1 2 3 |
인덱스 만들기 ism_웹사이트 ON `default` ( DISTINCT ARRAY media FOR media IN `social-media` WHEN media.type = 'website' END ) WHERE 유형 = '사람'; |
다음 사항에 유의하십시오. 언제 연산자를 생성할 때 ism_웹사이트 색인을 생성합니다.
배열 인덱싱에 대한 자세한 내용은 다음을 참조하세요. 여기를 참조하세요. Couchbase에서 인덱스 생성에 대한 다른 유용한 문서도 함께 제공됩니다.
배열 인덱스에 대한 변수 일치 요건 완화
4.x 릴리스에서는 배열 인덱싱에 정확히 동일한 변수 이름을 사용해야 했습니다. 선택 쿼리에서 사용된 인덱스 생성 진술. 자세한 내용 보기 여기.
예를 들어, 위에서 본 이전 쿼리를 참조하면 변수 미디어 배열을 반복하는 데 사용되는 소셜 미디어 은 매우 중요합니다. 4.x의 배열 인덱싱에서는 정확한 변수 이름이 필수입니다. 미디어 를 사용하여 이전 선택 쿼리.
Couchbase 5.0 릴리스에서는 이 요구 사항이 완화되었으며, 다음 쿼리는 완벽하게 작동합니다:
|
1 2 3 4 |
설명 선택 * 기본값에서 사용 지수(ISM) WHERE type = 'person' AND `social-media`의 모든 m이 m.type = 'website'를 만족하면 끝납니다; |
인덱스 ism 변수 이름 사용 미디어를 사용하지만 위의 쿼리는 m. 그래도 위의 쿼리는 인덱스 ism 성공적으로 완료했습니다.
배열 인덱스에 대한 완화된 전체 배열 인덱스 키 요구 사항
또한 4.x 릴리스에서 지원되는 배열 인덱싱은 배열 인덱스 정의에서 전체 배열 속성을 필수 인덱스 키로 요구한다는 점을 기억하세요. 예를 들어 다음 쿼리를 다시 살펴봅시다:
|
1 2 3 |
설명 선택 * 기본값에서 WHERE type = 'person' 그리고 `social-media`의 모든 미디어가 media.type = 'website'를 만족하는 경우 END; |
위의 쿼리에 해당하는 커버된 배열 인덱스는 다음과 같습니다:
|
1 2 3 |
인덱스 만들기 ism_covered ON `기본값` ( DISTINCT ARRAY 미디어에 대한 미디어를 `소셜 미디어`에서 `소셜 미디어` END, `소셜 미디어`) WHERE 유형 = '사람'; |
두 번째 인덱스 키는 소셜 미디어 는 예를 들어 다음 쿼리를 처리하는 데 필수입니다:
|
1 2 3 |
미디어 선택 설명 기본값에서 여기서 유형 = '사람'이고 `소셜 미디어`의 모든 미디어가 미디어를 만족하는 경우 null 끝이 아닙니다; |
Couchbase 5.0에서는 동일한 쿼리가 인덱스에 의해 처리됩니다. ism 이 글의 맨 처음에 설명되어 있습니다.
이 기능은 배열 인덱스에 많은 기능을 제공한다는 점에 유의하는 것이 중요합니다. 이제 배열 인덱스의 각 항목이 저장 공간과 메모리를 덜 차지하기 때문입니다. 다음과 같은 이점이 있습니다:
- 더 큰 배열에 커버된 배열 인덱스 사용
- 커버된 배열 인덱스를 사용하여 쿼리의 효율성과 성능을 향상시킵니다.
문서 메타 정보 색인화
이제 색인화할 수 있는 새로운 메타 정보에 대해 차례로 살펴보겠습니다. 이전에는 인덱스를 만들 수 있는 메타().id 속성이 있지만 이제는 메타().cas 그리고 메타().만료 속성이 지원됩니다.
그렇다면 메타 속성을 키로 사용하는 인덱스는 어떻게 만들까요? 이미 알고 있는 것과 다르지 않습니다. 다음 커버링 인덱스를 예로 들어보겠습니다:
|
1 2 3 4 5 |
인덱스 생성 idx_cas ON `기본값` ( META().cas, META().expiration ) 인덱스 생성 idx_exp ON `기본값` ( 메타().만료 ) |
이제 IDX_CAS 그리고 IDX_EXP 인덱스에 대해 다음과 같은 작업을 수행할 수 있습니다:
|
1 2 3 4 5 6 7 |
SELECT META().id, META().cas 기본값에서 WHERE META().cas > 1489531586248179712; SELECT META().id, META().expiration 기본값에서 WHERE META().expiration > NOW_MILLIS(); |
그렇다면 왜 이러한 속성을 색인화할 수 있을까요? 오늘 만료된 모든 문서 또는 오늘 수정된 모든 문서에 대한 쿼리를 수행하려는 경우 어떻게 해야 할까요?
CAS 및 만료 속성에 대한 자세한 내용은 다음을 참조하세요. 여기. Couchbase에서 N1QL을 색인화하거나 사용하는 방법에 대한 자세한 내용은 카우치베이스 개발자 포털.