Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

Multikey Indexes

이 페이지의 내용

  • 사용 사례
  • 시작하기
  • 세부 정보
  • 인덱스 바운드
  • Unique Multikey Indexes
  • 복합 멀티키 인덱스
  • 정렬
  • 샤드 키
  • 해시 인덱스
  • 지원되는 쿼리
  • 배열 필드 전체에 대한 쿼리
  • $expr
  • 자세히 알아보기

배열의 포함된 필드에 인덱스를 만들어 멀티키 인덱스를 생성하고 관리할 수 있습니다. 멀티키 인덱스는 배열 필드에 대한 쿼리 성능을 향상시킵니다.

멀티키 유형을 명시적으로 지정할 필요가 없습니다. 배열 값이 포함된 필드에 인덱스를 생성하면 MongoDB는 자동으로 해당 인덱스를 멀티키 인덱스로 설정합니다.

MongoDB는 스칼라 값(예: 문자열 및 숫자)과 내장된 문서를 모두 포함하는 배열에 대해 멀티키 인덱스를 만들 수 있습니다. 배열에 동일한 값의 인스턴스가 여러 개 포함된 경우 인덱스에는 해당 값에 대한 항목이 하나만 포함됩니다.

멀티키 인덱스를 만들려면 다음 프로토타입을 사용합니다:

db.<collection>.createIndex( { <arrayField>: <sortOrder> } )

이 이미지는 addr.zip 필드의 멀티키 인덱스를 보여줍니다.

``addr.zip`` 필드의 멀티키 인덱스 다이어그램 입니다. ``addr`` 필드에는 주소 문서 배열이 포함되어 있습니다. 주소 문서에는 ``zip`` 필드가 포함되어 있습니다.

MongoDB Atlas에서 호스팅되는 배포서버를 위해 UI에서 멀티키 인덱스를 생성하고 관리할 수 있습니다.

애플리케이션이 배열 값이 포함된 필드를 자주 쿼리하는 경우 멀티키 인덱스는 해당 쿼리의 성능을 향상시킵니다.

일반적으로 쿼리되는 필드를 인덱싱하면 해당 쿼리를포괄할 가능성이 높아집니다. 포함된 쿼리는 문서를 검사하지 않고도 인덱스를 사용하여 완전히 충족할 수 있는 쿼리입니다. 이렇게 하면 쿼리 성능이 최적화됩니다.

예를 들어 students 컬렉션의 문서에는 학생이 학기 내내 받은 시험 점수의 배열인 test_scores 필드가 포함되어 있습니다. test_scores90 이상인 학생이 5개 이상인 상위 학생 목록을 정기적으로 업데이트합니다.

이 쿼리의 성능을 개선하기 위해 test_scores 필드에 인덱스를 만들 수 있습니다. test_scores 에 배열 값이 포함되어 있으므로 MongoDB는 인덱스를 멀티키 인덱스로 저장합니다.

멀티키 인덱스를 생성하려면 다음을 참조하세요.

이 섹션에서는 멀티키 인덱스의 기술적 세부 사항과 제한 사항에 대해 설명합니다.

인덱스 스캔의 바운드는 쿼리 중에 검색할 인덱스 부분을 정의합니다. 멀티키 인덱스 바운드 계산은 특별한 규칙을 따릅니다. 자세한 내용은 멀티키 인덱스 바운드를 참조하세요.

고유한 멀티키 인덱스에서 문서에는 해당 문서의 인덱스 키 값이 다른 문서의 인덱스 키 값과 중복되지 않는 한 반복되는 인덱스 키 값을 초래하는 배열 요소가 있을 수 있습니다.

이 동작에 대해 자세히 알아보고 예시를 보려면 별도의 문서로 고유한 제약 조건을 참조하세요.

복합 멀티키 인덱스에서 각 인덱스된 문서에는 값이 배열인 인덱스된 필드가 하나만 있을 수 있습니다. 구체적으로 다음과 같습니다.

  • 인덱스 사양에서 둘 이상의 필드가 배열인 경우 복합 멀티키 인덱스를 생성할 수 없습니다. 예를 들어 이 문서가 포함된 컬렉션을 생각해 보겠습니다.

    { _id: 1, scores_spring: [ 8, 6 ], scores_fall: [ 5, 9 ] }

    인덱스의 두 필드가 모두 배열이므로 복합 멀티키 인덱스 { scores_spring: 1, scores_fall: 1 }을 생성할 수 없습니다.

  • 복합 멀티키 인덱스가 이미 존재하는 경우 이 제한 사항을 위반하는 문서를 삽입할 수 없습니다.

    이러한 문서가 포함된 컬렉션을 생각해 보세요:

    { _id: 1, scores_spring: [8, 6], scores_fall: 9 }
    { _id: 2, scores_spring: 6, scores_fall: [5, 7] }

    복합 멀티키 인덱스 { scores_spring: 1, scores_fall: 1 }을 만들 수 있는 이유는 각 문서에 대해 복합 멀티키 인덱스로 인덱싱되는 필드가 배열 하나뿐이기 때문입니다. 문서에 scores_springscores_fall 필드 모두에 대한 배열 값이 포함되어 있지 않습니다.

    그러나 복합 멀티키 인덱스를 생성한 후에는 scores_springscores_fall 필드가 모두 배열인 문서를 삽입하려고 하면 삽입이 실패합니다.

멀티키 인덱스 로 인덱싱된 배열 필드를 기준으로 정렬하는 경우 다음 두 가지 모두에 해당하지 않는 한 쿼리 계획에 블로킹 정렬 단계가 포함됩니다.

  • 모든 정렬 필드의 인덱스 경계[MinKey, MaxKey]입니다.

  • 멀티키 인덱스 필드의 경계에는 정렬 패턴과 동일한 경로 접두사가 없습니다.

멀티키 인덱스를 샤드 키 인덱스로 지정할 수 없습니다.

그러나 샤드 키 인덱스가 복합 인덱스의 접두사(prefix)이고 (샤드 키의 일부가 아닌) 후행 키 중 하나가 배열을 인덱싱하는 경우 복합 인덱스가 복합 멀티키 인덱스가 될 수 있습니다.

해시 인덱스는 멀티키일 수 없습니다.

멀티키 인덱스는 다음 조건이 충족되는 경우 쿼리를 처리할 수 있습니다.

  • 쿼리가 배열 필드를 반환하지 않습니다(즉, 배열이 쿼리 프로젝션에 포함되지 않습니다). 즉, 쿼리를 처리하려면 다중 키 인덱스가 복합이어야 합니다.

  • $elemMatch를 포함하지 않습니다.

  • 다른 모든 지원되는 쿼리 요구 사항을 충족합니다.

예를 들어 이러한 문서가 포함된matches 컬렉션을 생각해 보겠습니다:

db.matches.insertMany( [
{ name: "Joe", event: [ "open", "tournament" ] },
{ name: "Bill", event: [ "match", "championship" ] }
] )

matches 컬렉션은 eventname 필드에 복합 다중 키 인덱스를 가지고 있습니다:

db.matches.createIndex( { event: 1, name: 1 } )

event 필드에 배열 값이 포함되어 있으므로 이전 인덱스는 멀티키입니다.

인덱스는 다음과 같은 쿼리를 다룹니다.

db.matches.find(
{ event: 'championship' },
{ _id: 0, name: 1 }
)
db.matches.find(
{ name: 'Bill', event: 'championship' },
{ _id: 0, name: 1 }
)

프로젝션에 event 배열 필드가 포함되어 있기 때문에 다음 쿼리는 인덱스에 포함되지 않습니다.

db.matches.find(
{ event: 'championship' },
{ _id: 0, event: 1 }
)

쿼리 필터가 배열 전체에 대해 정확히 일치하는 항목을 지정하는 경우, MongoDB는 멀티키 인덱스를 사용하여 쿼리 배열의 첫 번째 요소를 조회할 수 있지만 멀티키 인덱스 스캔을 사용하여 전체 배열을 찾을 수는 없습니다.

대신, 멀티키 인덱스를 사용하여 쿼리 배열의 첫 번째 요소를 조회한 후 MongoDB는 관련 문서를 검색하고 배열이 쿼리의 배열과 일치하는 문서를 필터링합니다.

예를 들어 이러한 문서가 포함된 inventory 컬렉션을 생각해 보겠습니다.

db.inventory.insertMany( [
{ _id: 5, type: "food", item: "apple", ratings: [ 5, 8, 9 ] }
{ _id: 6, type: "food", item: "banana", ratings: [ 5, 9 ] }
{ _id: 7, type: "food", item: "chocolate", ratings: [ 9, 5, 8 ] }
{ _id: 8, type: "food", item: "fish", ratings: [ 9, 5 ] }
{ _id: 9, type: "food", item: "grapes", ratings: [ 5, 9, 5 ] }
] )

inventory 컬렉션에는 ratings 필드에 멀티키 인덱스가 있습니다.

db.inventory.createIndex( { ratings: 1 } )

다음 쿼리는 ratings 필드가 [ 5, 9 ]배열인 문서를 찾습니다.

db.inventory.find( { ratings: [ 5, 9 ] } )

MongoDB는 멀티키 인덱스를 사용하여 ratings 배열의 임의 위치에 5가 있는 문서를 찾을 수 있습니다. 그런 다음 MongoDB는 이러한 문서를 조회하고 ratings 배열이 쿼리 배열 [ 5, 9 ]와 동일한 문서를 필터링합니다.

$expr 연산자는 멀티키 인덱스를 지원하지 않습니다.

돌아가기

정렬 순서