본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


몽고DB

몽고DB에서의 Aggregate 사용시 lookup과 인덱스(index)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 6. 23.

몽고db에서도 관계형 데이터베이스와 마찬가지로 인덱스(색인)을 지원 합니다.

인덱스를 만드는 방법은 전용 DMBS인 몽고DB 콤파스를 활용하거나 명령어를 통해서 생성 할 수 있습니다.

아래와 같이 인덱스를 만들었다고 가정하여 봅니다.

db.컬렉션.createIndex( { "ADDRESS": 1, "PHONE_NUMBER":1 } )

 

위 내용을 보아하면 ADDRESS와 PHONE_NUMBER라는 필드에 인덱스를 만든 것으로 볼 수 있습니다.

요렇게 인덱스가 추가되었습니다.

 

위에 선언한 인덱스를 사용해 보도록 하겠습니다.

findOne, findAll 등 이러한 함수를 동작 시킬 때 ADDRESS나 PHONE_NUMBER로 조건을 주어 검색한다면 색인 사용여부가 증가하게 됩니다.

ADDRESS값이 AA.COMC.S.E 값만 나오게 해 보았더니 인덱스 사용이 0에서 1로 증가하였습니다.

 

색인 사용여부가 증가하였다는 것은 인덱스가 정상적으로 참조되어 find의 명령어가 동작하였음을 의미 합니다.

몽고DB에서도 마찬가지로 색인을 통해서 조건을 주고 검색하거나 정렬을 하게 되면 빠른 속도와 안정성을 보장받을 수 있습니다.

 

여기서 유의해야 할 점으로는, 집계(Aggregate)함수를 동작시킬 때 인덱스 사용방법이 조금 다르다는 것 입니다.

특히, lookup을 통해서 다른 컬렉션이 포함된 동작을 하는 경우에는 lookup에 사용되는 인덱스는 그룹형태의 인덱스가 아니라 분리가 되야하는 것 입니다.

이해를 위해 인덱스를 추가하여 보겠습니다.

PHONE_NUMBER 필드에 대해서 새로 인덱스를 추가하였습니다.

 

이제 test_collectionlookup 대상으로 선정하고 다른 컬렉션인 other_test_collection에서 집계를 해 보겠습니다.

other_test_collection에서 test_collection을 포함시킨 aggregate입니다.

 

other_test_collection에 존재하는 PHONE_NUMBER 필드와, test_collection존재하는 PHONE_NUMBER 필드를 서로 매칭하여 aggregate하였습니다.

자바코드로 된 소스코드이지만 관계형 데이터베이스 기준으로 바꾸어 설명하면,

other_test_collection 테이블의 PHONE_NUMBER 컬럼값 을 참조키로 test_collection 테이블의  PHONE_NUMBER 컬럼값을 매칭하여 join 한 개념 입니다.

아래 사진처럼 매핑했다고 보면 될 것 같습니다.

요런 형태의 결과라고 보면 될 것 같습니다~

 

그러면 인덱스 사용여부를 확인하여 보겠습니다.

새로 추가한 인덱스 값만 증가하였습니다.

 

lookup에서 사용된 key 값은 PHONE_NUMBER라는 필드 값 입니다. (Join에서 사용된 참조키)

 

PHONE_NUMBER가 인덱스 된 곳은 2군데 이지만 실제로 사용된 것은 단일로 선언한 PHONE_NUMBER_IDX 이름을 가진 1곳 뿐 입니다.

aggregate에서 인덱스는 위 사진과 같이 고유로 1개만 지정된 인덱스만 동작한다는 점 입니다!

 

다시 말해, aggregate 함수를 실행할 때 효율적인 인덱스를 사용하려면 필드값을 묶어서 인덱스를 선언하지 말고 단일로 선언해 주어야 한다는 점 입니다.

만약 lookup해야되는 데이터가 몇십만 몇백만개의 데이터로 이루어진 경우에 해당 대상의 key 값이 단일 인덱스로 선언되지 않으면 인덱스를 타지않고 쿼리가 동작해버려 언제 끝날지 모르는 aggregate가 실행 되 버릴 수 있습니다.

 

aggregate에서 lookup을 활용하여 다른 컬렉션을 참조시키는 경우에 대상 필드값은 반드시 단일 인덱스가 되어야 하는 것을 잊지 말아야 합니다.

이상으로 몽고DB에서의 aggregate 사용시 lookup이 필요한 컬렉션의 인덱스(index)의 선언 방법에 대해서 살펴보았습니다.

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글