이 문서에서는 다음을 사용하여 N1QL 쿼리로 시작하는 몇 가지 실제 예제를 살펴봅니다. GSI 지수 를 사용하여 시간이 지남에 따라 문서 크기뿐만 아니라 실제 문서 구조도 함께 증가하는 데이터 세트를 시뮬레이션할 수 있습니다. 카우치베이스 서버는 유연한 스키마를 쉽게 만들 수 있지만, 새로운 필드와 데이터가 추가되면 더 많은 GSI 인덱스를 추가하고 이를 유지 관리해야 합니다.

저희의 플렉스 인덱스 문서를 읽어보지 않았다면 이 블로그 게시물에서 플렉스 인덱스 사용에 익숙해질 수 있도록 몇 가지 실용적인 예제를 다룰 것입니다.

Couchbase 6.5(초기 프리뷰)부터 시작하여 이제 더 많은 지원이 제공됩니다. Couchbase 6.6 릴리스를 사용하면 Flex 인덱스를 활용할 수 있습니다. 조건이 미리 정해져 있지 않고 검색 술어에 많은 수의 필드가 포함되는 경우에 사용하기 좋은 도구입니다. 우리는 이러한 상황을 타겟팅할 것입니다. 여행 샘플 버킷을 사용하면 쉽게 시작하고 실행하고 따라갈 수 있습니다.

서버 및 데이터 준비

시작하려면 다음이 필요합니다. 도커를 사용하여 카우치베이스 서버 6.6을 설치했습니다.를 설치해야 하지만 로컬켜짐 카우치베이스 클라우드또는 선호하는 클라우드 플랫폼에서 원하는 경우

카우치베이스 서버가 가동되고 실행되면, 여행 샘플 샘플 버킷 설치. 이제 31,631개의 문서를 사용할 수 있습니다.

travel-sample data oveview

이 데이터세트를 바로 쿼리할 수 있도록 기본 기본 인덱스와 GSI 인덱스도 설치되어 있습니다.

travel-sample indexes

호텔 데이터에 대해 실행할 쿼리의 경우 인덱스 탭에 설치된 인덱스 중 3개만 사용할 것입니다.

    • def_city
    • def_primary
    • def_type

이렇게 하면 3개의 인덱스가 남게 되며, 호텔 기록을 쿼리하는 것이 유일한 목적이라면 여행 샘플 데이터 세트의 기존 데이터에 대한 쿼리에는 이 인덱스만으로도 충분하다고 가정할 수 있습니다. 우리의 "호텔" 유형 문서의 경우, 이 세 가지 인덱스가 예제에서 사용하는 인덱스입니다.

기본 GSI 지수

먼저 N1QL 쿼리부터 살펴보겠습니다. WITHOUT 플렉스 인덱싱.

함께 제공되는 미리 빌드된 GSI 인덱스를 사용하여 이 N1QL 쿼리를 실행할 때 여행 샘플 데이터 집합의 교집합을 사용하게 됩니다. def_type 그리고  def_city GSI 지수.

카우치베이스 서버 웹 UI에서, 쿼리 워크벤치 편집기에서 쿼리를 실행하고 계획을 검토하여 어떤 인덱스가 사용되고 있는지 확인합니다.

이 인덱스는 규칙 기반 최적화로 인해 선택된 것으로, 술어와 일치하는 인덱스가 있으면 해당 인덱스가 사용됩니다. Since "캘리포니아" 이 도시인 모든 문서의 주(州)로 나타납니다. "Fremont" 또는 "오클랜드"의 교집합을 사용할 수 있습니다. def_type 및 def_city 인덱스를 사용하여 최적의 성능을 얻을 수 있습니다.

더 많은 데이터 및 필드 추가

이제 데이터를 좀 더 추가해 보겠습니다. 다음과 같은 새 필드가 있는 30,000개의 문서를 추가하겠습니다:

  • : 번호
  • 직면: 문자열
  • 호텔 유형: 문자열
  • 주요 편의시설: 문자열 배열

따라하고 싶으시면 여행-샘플-가짜-호텔 리포지토리에 저장하고 server.js 파일을 실행하기 전에 연결 코드의 Couchbase 사용자 이름과 비밀번호가 올바른지 확인하세요.

이 작업이 완료되면 전체 문서 수는 61,631개가 되며, 이 중 30,000개는 쿼리 술어에 사용하려는 새 필드가 있는 새로 추가된 문서입니다.

새 필드가 있는 술어를 사용하여 새 데이터에 대한 쿼리를 추가하면 쿼리가 최적으로 수행되지 않습니다. 새 인덱스를 추가해야 합니다. 예를 들어

프로덕션 환경에서는 인덱스 하나를 추가하는 것이 때때로 지루할 수 있으며, 시간이 지나면서 인덱스를 유지 관리해야 하므로 DBA가 필요할 수도 있습니다.

호텔 유형에 대한 색인 추가

호텔 유형이 포함된 술어가 포함된 쿼리에 대한 더 나은 인덱스를 원한다면 다음을 추가하면 됩니다:

이 시점에서 다음과 같은 쿼리를 실행합니다:

기본 색인 대신 이 색인을 사용하거나 def_type 인덱스에 추가할 수 있습니다. 다음과 같이 추가한 새 필드를 포함하도록 쿼리에 새 술어를 추가하면 다음과 같이 표시됩니다. 직면호텔 유형, 그리고 아마도 우리의 주요 편의시설 배열을 사용하려면 쿼리 전략에 따라 새 인덱스를 신중하게 추가해야 합니다. Couchbase는 이 작업을 매우 잘 처리하며, 블로그와 같은 훌륭한 리소스(올바른 인덱스 생성, 올바른 성능 확보) 및 기타 유용한 리소스가 있습니다.

그러나 올바른 인덱스를 만들지 않으면 여러 가지 문제가 발생할 수 있는데, 그 중 하나는 데이터를 가져오는 데 걸리는 시간입니다. 

다음 쿼리는 새로 추가한 필드를 활용합니다:

위의 상황에서 만약 우리가 def_hotelType 인덱스를 사용하면 쿼리 시간이 5초 이상, 500ms가 넘는 것을 확인할 수 있습니다.

이러한 인덱스의 오버헤드는 구축하는 데 약 10초 정도 소요되며, 데이터 검색 시 전체 시간과 성능을 고려하면 10배의 결과를 얻을 수 있습니다. 잘못된 인덱스를 사용할 경우 검색해야 할 문서가 3만 개에 달한다는 점을 기억하세요.

더 많은 인덱스를 추가하여 따라잡기

보유한 데이터의 양과 데이터의 다른 여러 특성에 따라 호텔 입구가 어느 쪽을 향하고 있는지를 나타내는 '마주보고 있는' 필드에 쿼리하려는 술어에 대한 또 다른 인덱스를 추가할 수 있습니다.

더 좋은 방법은 ADVICE 기능을 사용하여 새 인덱스를 추가하는 것인데, 개별 인덱스를 추가하는 것보다 후자의 제안을 권장합니다. ADVICE 기능을 사용하면 추가할 다음 인덱스가 추천됩니다:

더 나은 성능을 얻을 수 있습니다. adv_facing_hotelType_type 인덱스가 제안되었지만, 이와 유사하지만 연산 순서가 다른 쿼리의 다른 순열을 고려하면 다른 결과를 얻을 수 있습니다. 이 모든 것이 쿼리할 때 주의해야 할 사항이며 어떤 인덱스를 사용할지 알아야 합니다.

호텔 유형의 데이터를 쿼리할 수 있지만 쿼리를 더 유연하게 할 수 있는 인덱스를 사용하면 어떨까요? 이 인덱스는 애드혹 쿼리와 같은 작업에 사용될 수 있고 잠재적으로 GSI 인덱스 대신 사용할 수 있을 만큼 성능이 뛰어나므로 다른 개발자에게도 유용할 수 있습니다. 단일 인덱스 옵션이 있다면 어떨까요?

데이터로 유연하게 활용하기

Couchbase Server 6.6에는 여러분의 요구를 충족시킬 수 있는 Flex 인덱싱 기능이 있습니다. 멋진 점은 이 기능을 사용하는 방법을 아주 쉽게 보여드릴 수 있다는 것입니다.

우리는 N1QL 쿼리 엔진에 플렉스 인덱스를 사용하려는 의도를 알려야 합니다. 또한 쿼리에는 플렉스 인덱싱을 사용하기 위한 특정 특성이 있어야 하며, 이러한 요구 사항이 충족되면 N1QL 쿼리가 FTS 쿼리로 변환되어 전체 텍스트 인덱스에 대해 실행됩니다.

문서에 있는 정보를 반복하지 않기 위해 다음과 같은 사항을 언급하는 것이 중요합니다. 의미론적 차이 그리고 제한 사항 를 사용할 수 없습니다. 따라서 이러한 제한을 피하고 의미론적 차이를 인식하도록 노력할 것입니다.

FTS 플렉스 인덱스 설정

I여행 샘플 데이터 세트에 대해 이미 설정한 인덱스 대신 쿼리를 실행할 Flex 인덱스를 가져오려면 Couchbase Server 웹 UI의 검색 탭으로 이동한 다음 "색인 추가" 를 클릭하고 다음 입력란을 채우세요.

  1. 의 경우 이름 필드에 "fts-index"보다 설명적인 이름을 사용하는 것이 좋습니다.
  2. 문서가 들어있는 버킷을 선택하세요.
  3. 의 경우 JSON 유형 필드입니다, 유형을 지정합니다.
  4. 클릭 +유형 매핑 추가 를 클릭하고 문서 유형: 호텔
  5. 선택 "키워드" 기본 분석기 드롭다운에서
  6. 체크 표시를 해제합니다. 기본값 버킷의 모든 문서 유형을 스캔하지 않도록 유형 매핑을 사용합니다.

FTS 힌트 사용

여전히 N1QL 쿼리에서 Flex 인덱싱을 사용하려고 한다는 것을 표시해야 합니다. 위의 상황에서는 다음과 같은 유형의 문서를 검색하는 아주 기본적인 N1QL 쿼리가 있습니다. "호텔" 플렉스 인덱싱을 활용하기 위해 해당 쿼리를 변경하려면 (FTS 사용) 힌트:

이 쿼리는 이제 인덱스의 일반적인 특성으로 인해 우리가 설정한 플렉스 인덱스를 사용하고 이를 처리하도록 플렉스 인덱싱을 위임합니다.

쿼리 옵션은 다양합니다.

몇 가지 쿼리를 더 실행해 보았는데, 쿼리를 실행하고 데이터를 검색하는 데 걸리는 전체 시간을 고려할 때 각각이 GSI 인덱스에 비해 비슷한 이점이 있는 것 같습니다.

여기에 도시 술어를 추가했습니다.

다음으로, 술어에 도시와 별 필드를 결합합니다.

type="hotel"을 빼면 어떻게 되나요? (16초 기본 스캔)

다음 사항을 추가하고자 합니다. WHERE 유형="호텔" 를 술어에 매핑하는 경우, 설정한 특정 Flex Index를 사용할 때 어떤 의미에서는 쿼리 술어에서 가장 중요한 부분이며 그렇지 않으면 Flex Index가 선택되지 않는다는 것을 기억하세요. 유형 매핑된 인덱스는 조건 표현식(예 유형 = "호텔")가 쿼리에서 누락되었습니다.

사용해보겠습니다. 주요 편의시설 필드에 문자열이 있는지 확인합니다. "레스토랑" 가 포함되어 있습니다.

마무리

GSI 인덱스와 Flex 인덱싱의 기본 사항을 살펴보고, Couchbase에서 인덱싱을 시작하는 방법을 보여드렸습니다. 이 내용이 설명서를 읽는 것을 대신할 수는 없지만 더 쉽게 시작하는 데 도움이 될 수 있습니다. 이제 이 지식을 바탕으로 Flex 인덱싱에 접근하는 방법을 이해하셨을 것입니다.

읽어 주셔서 감사합니다, Flex 인덱싱 문서를 확인하세요. 에서 자세한 정보를 확인하세요!

작성자

게시자 에릭 비샤드

국제 연사, 블로그 운영, JavaScript, React, GraphQL 및 NoSQL 커뮤니티를 위한 옹호 활동, Couchbase의 선임 개발자 옹호자로 활동하고 있습니다.

댓글 남기기