AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

인덱스를 사용하여 쿼리 최적화

이 가이드에서는 MongoDB Scala 드라이버를 사용하여 인덱스를 생성하고 관리하는 방법에 대해 학습할 수 있습니다.

인덱스는 MongoDB에서 쿼리를 효율적으로 실행할 수 있도록 지원합니다. 인덱스가 없으면 MongoDB는 컬렉션 스캔을 수행하여 컬렉션의 모든 문서를 읽어 쿼리 일치를 찾아야 합니다. 컬렉션 스캔은 애플리케이션 성능을 느리게 할 수 있습니다. 쿼리에 적합한 인덱스가 있는 경우 MongoDB는 해당 인덱스를 사용하여 검사할 문서를 제한합니다.

인덱스는 다음과 같은 기능도 제공합니다.

또한 MongoDB 업데이트 작업 및 삭제 작업에 대한 문서를 찾을 때 인덱스를 사용합니다. 집계 파이프라인 의특정 단계에서도 인덱스를 사용하여 성능을 개선합니다.

MongoDB에 대해 쿼리를 실행할 때 명령에 다음 요소가 포함될 수 있습니다.

  • 찾고 있는 필드와 값을 지정하는 쿼리 기준

  • 쿼리 실행에 영향을 주는 옵션(예: 읽기 고려)

  • MongoDB 반환하는 필드를 지정하는 프로젝션 기준(선택 사항)

  • 문서가 반환되는 순서를 지정하는 정렬 기준(선택 사항)

쿼리, 프로젝션 및 정렬의 모든 필드가 동일한 인덱스에 있는 경우 MongoDB는 인덱스에서 결과를 반환합니다. 이 과정을 커버 쿼리라고 합니다.

중요

정렬 순서

정렬 기준은 인덱스의 순서와 일치하거나 반대가 되어야 합니다.

필드 name는 오름차순(A-Z)으로 인덱스가 있고 필드 age는 내림차순(9-0)으로 인덱스가 있다고 가정해 보겠습니다.

name_1_age_-1

MongoDB는 다음 중 하나를 기준으로 데이터를 정렬할 때 이 인덱스를 사용합니다.

  • name 오름차순, age 내림차순

  • name 내림차순, age 오름차순

nameage을 모두 오름차순 또는 모두 내림차순으로 지정하려면 인메모리 정렬이 필요합니다.

인덱스 커버리지에 대한 자세한 내용은 MongoDB Server 매뉴얼의 쿼리 최적화를 참조하세요.

다음 지침에서는 애플리케이션에서 인덱스를 사용하는 방식을 최적화하는 방법에 대해 설명합니다.

  • 쿼리 성능을 향상시키려면 애플리케이션의 쿼리와 정렬된 결과를 반환하는 작업에 자주 나타나는 필드에 인덱스를 빌드합니다.

  • 추가하는 각 인덱스는 활성화되면 디스크 공간과 메모리를 사용하므로 용량 계획을 위해 인덱스 메모리와 디스크 사용량을 추적합니다.

  • 자주 사용하지 않는 인덱스는 추가하지 마세요. 쓰기 작업이 인덱스된 필드를 업데이트하면 MongoDB는 관련 인덱스를 업데이트합니다.

MongoDB는 동적 스키마를 지원하므로 애플리케이션은 이름을 미리 알 수 없거나 임의적인 필드를 쿼리할 수 있습니다. MongoDB 4.2는 이러한 쿼리를 지원하기 위해 와일드카드 인덱스를 도입했습니다. 와일드카드 인덱스는 워크로드 기반 인덱스 계획을 대체하도록 설계되지 않았습니다.

데이터 모델을 설계하고 애플리케이션에 적합한 인덱스를 선택하는 방법에 대한 자세한 내용은 인덱싱 전략데이터 모델링 및 인덱스에 대한 MongoDB 서버 설명서를 참조하세요.

다음 샘플 애플리케이션 사용하여 이 페이지의 코드를 테스트할 수 있습니다. 샘플 애플리케이션 사용하려면 다음 단계를 수행하세요.

  1. 프로젝트 에 스칼라 운전자 설치되어 있는지 확인합니다. 자세한 학습 은 다운로드 및 설치 가이드 참조하세요.

  2. 다음 코드를 복사하여 새 .scala 파일에 붙여넣습니다.

  3. 이 페이지에서 코드 예제를 복사하여 파일의 지정된 줄에 붙여넣습니다.

import org.mongodb.scala._
import org.mongodb.scala.model.SearchIndexModel
import java.util.concurrent.TimeUnit
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import org.mongodb.scala.model.Indexes
object SearchIndexes {
def main(args: Array[String]): Unit = {
// Create a new client and connect to the server
val mongoClient = MongoClient("<connection string URI>")
val database = mongoClient.getDatabase("<database name>")
val collection = database.getCollection("<collection name>")
// Start example code here
// End example code here
Thread.sleep(1000)
mongoClient.close()
}
}

이 가이드의 예시에서는 Atlas 샘플 데이터 세트sample_mflix 데이터베이스에 있는 movies 컬렉션을 사용합니다. 무료 MongoDB Atlas 클러스터 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 Atlas 시작하기를 참조하세요.

MongoDB는 데이터 쿼리를 지원하기 위해 여러 가지 인덱스 유형을 지원합니다. 다음 섹션에서는 가장 일반적인 인덱스 유형을 설명하고 각 인덱스 유형을 생성하기 위한 샘플 코드를 제공합니다. 인덱스 유형의 전체 목록은 MongoDB Server 매뉴얼의 인덱스 를 참조하세요.

단일 필드 인덱스는 컬렉션 문서 내의 단일 필드에 대한 참조가 있는 인덱스입니다. 단일 필드 쿼리 및 정렬 성능을 향상시키고, 특정 시간 후 또는 특정 클록 시간에 컬렉션에서 문서를 자동으로 제거하는 TTL 인덱스 를 지원합니다.

참고

_id_ 인덱스는 단일 필드 인덱스의 예입니다. 이 인덱스는 새 컬렉션이 생성될 때 _id 필드에 자동으로 생성됩니다.

다음 예시 에서는 지정된 필드 에 오름차순 인덱스 를 생성합니다.

val index = Indexes.ascending("<field name>")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

이 섹션의 예제를 실행하려면 파일에 다음 가져오기 문을 포함해야 합니다.

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

createIndex() 메서드를 사용하여 단일 필드 인덱스 를 만듭니다. 다음 예시 에서는 title 필드 에 오름차순으로 인덱스 를 생성합니다.

val index = Indexes.ascending("title")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

listIndexes() 메서드를 사용하여 인덱스 생성되었는지 확인할 수 있습니다. 다음 출력과 같이 목록에 title 에 대한 인덱스 표시되어야 합니다.

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"title": 1}, "name": "title_1"}

다음은 title 필드 에 생성된 인덱스 에 포함되는 쿼리 의 예시 입니다.

val filter = equal("title", "Sweethearts")
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"_id":...,"plot":"A musical comedy duo...",
"genres":["Musical"],...,"title":"Sweethearts",...}

복합 인덱스에는 컬렉션의 문서 내에 있는 여러 필드에 대한 참조가 포함되어 있어 쿼리 및 정렬 성능을 향상시킵니다.

인덱스 접두사에 대해 자세히 학습 MongoDB Server 매뉴얼의 인덱스 접두사 항목을 참조하세요.

다음 예시 지정된 두 필드에 복합 인덱스 생성합니다.

val index = Indexes.compoundIndex(
Indexes.descending("<field name 1>"),
Indexes.ascending("<field name 2>")
)
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

이 섹션의 예제를 실행하려면 파일에 다음 가져오기 문을 포함해야 합니다.

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

createIndex() 메서드를 사용하여 복합 인덱스 만듭니다. 다음 예시 runtime 필드 에 내림차순으로 인덱스를 생성하고 year 필드 에 오름차순으로 인덱스 생성합니다.

val index = Indexes.compoundIndex(Indexes.descending("runtime"),
Indexes.ascending("year"))
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

listIndexes() 메서드를 사용하여 인덱스 생성되었는지 확인할 수 있습니다. 다음 출력과 같이 목록에 runtimeyear 에 대한 인덱스 표시되어야 합니다.

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"runtime": -1, "year": 1}, "name": "runtime_-1_year_1"}

다음은 runtimeyear 필드에 생성된 인덱스 가 적용되는 쿼리 의 예시 입니다.

val filter = and(gt("runtime", 80), gt("year", 1999))
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"_id":...,"runtime": 98,...,"title": "In the Mood for Love",...,"year": 2000,...}

멀티키 인덱스는 배열 값 필드에 대한 쿼리 성능을 개선하는 인덱스입니다. 메서드와 createIndex() 단일 필드 인덱스생성하는 데 사용하는 것과 동일한 구문을 사용하여 컬렉션 에 멀티키 인덱스 생성할 수 있습니다.

멀티키 인덱스 생성할 때는 다음 세부 정보를 지정해야 합니다.

  • 인덱스 를 생성할 필드

  • 각 필드 의 정렬 순서(오름차순 또는 내림차순)

다음 예시 에서는 지정된 배열 값 필드 에 멀티키 인덱스 를 생성합니다.

val index = Indexes.ascending("<field name>")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

이 섹션의 예제를 실행하려면 파일에 다음 가져오기 문을 포함해야 합니다.

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

createIndex() 메서드를 사용하여 멀티키 인덱스 만듭니다. 다음 예시 cast 필드 에 오름차순으로 인덱스 생성합니다.

val index = Indexes.ascending("cast")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

listIndexes() 메서드를 호출하여 인덱스 생성되었는지 확인할 수 있습니다. 다음 출력과 같이 목록에 cast 에 대한 인덱스 표시되어야 합니다.

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"cast": 1}, "name": "cast_1"}

다음은 cast 필드 에 생성된 인덱스 에 포함되는 쿼리 의 예시 입니다.

val filter = and(equal("cast", "Aamir Khan"), equal("cast", "Kajol"))
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"_id":...,"title":"Fanaa",...,"cast": ["Aamir Khan", "Kajol", "Rishi Kapoor", "Tabu"],...}

MongoDB Search를 사용하면 MongoDB Atlas 에서 호스팅되는 컬렉션에서 전체 텍스트 검색을 수행할 수 있습니다. MongoDB Search 인덱스는 검색 동작과 인덱스 할 필드를 지정합니다.

MongoDB Vector Search를 사용하면 MongoDB에 저장된 벡터 임베딩에 대한 시맨틱 검색을 수행할 수 있습니다. MongoDB Vector Search에 대해 자세히 학습하려면 MongoDB Vector Search 개요를 참조하세요.

컬렉션 에서 다음 메서드를 호출하여 MongoDB Search 및 MongoDB Vector Search 인덱스를 관리 할 수 있습니다.

  • createSearchIndex()

  • createSearchIndexes()

  • listSearchIndexes()

  • updateSearchIndex()

  • dropSearchIndex()

참고

이전 인덱스 관리 방법은 비동기적으로 실행되며 성공적으로 실행되었는지 확인하기 전에 반환될 수 있습니다. 인덱스의 현재 상태를 확인하려면 listSearchIndexes() 메서드를 호출합니다.

createSearchIndex()createSearchIndexes() 메서드를 사용하여 하나 이상의 MongoDB Search 또는 MongoDB Vector Search 인덱스를 만들 수 있습니다. createSearchIndexes() 메서드는 인덱스 정의 목록을 허용하여 한 번의 호출에서 여러 개의 인덱스를 만들고 각 인덱스의 인덱스 유형을 지정할 수 있습니다.

다음 코드 예시 MongoDB 검색 인덱스를 생성하는 방법을 보여줍니다.

val index = Document("mappings" -> Document("dynamic" -> true))
collection.createSearchIndex("<index name>", index)
.subscribe((result: String) => ())

createSearchIndexes() 메서드를 사용하여 여러 MongoDB Search 또는 MongoDB Vector Search 인덱스를 만듭합니다.

다음 코드 예시는 한 번의 호출로 MongoDB Search 및 MongoDB 벡터 검색 인덱스를 생성하는 방법을 보여줍니다.

val searchIdxMdl = SearchIndexModel(
Option("searchIdx"),
Document("analyzer" -> "lucene.standard", "mappings" -> Document("dynamic" -> true)),
Option(SearchIndexType.search())
)
val vectorSearchIdxMdl = SearchIndexModel(
Option("vsIdx"),
Document(
"fields" -> List(
Document("type" -> "vector", "path" -> "embeddings", "numDimensions" -> 1536, "similarity" -> "dotProduct")
)
),
Option(SearchIndexType.vectorSearch())
)
collection.createSearchIndexes(List(searchIdxMdl, vectorSearchIdxMdl))
.subscribe((result: String) => ())

MongoDB Search 인덱스를 정의하는 데 사용되는 구문에 대해 자세히 학습 Atlas 매뉴얼의 인덱스 참조 가이드 참조하세요.

listSearchIndexes() 메서드를 사용하여 컬렉션 의 모든 MongoDB Search 인덱스를 반환할 수 있습니다.

다음 코드 예시는 listSearchIndexes() 메서드에서 반환된 Observable을 구독하여 컬렉션의 검색 인덱스 목록을 출력하는 방법을 보여줍니다.

collection.listSearchIndexes()
.subscribe((result: Document) => println(result.toJson()))
{"id": "...", "name": "<index name 1>", "type": "search", "status": "READY", "queryable": true, ... }
{"id": "...", "name": "<index name 2>", "type": "search", "status": "READY", "queryable": true, ... }

updateSearchIndex() 메서드를 사용하여 MongoDB 검색 인덱스 업데이트 할 수 있습니다.

다음 코드에서는 검색 업인덱스를데이트하는 방법을 보여줍니다.

val updateIndex = Document("mappings" -> Document("dynamic" -> false))
collection.updateSearchIndex("<index to update>", updateIndex)
.subscribe((result: Unit) => ())

dropSearchIndex() 메서드를 사용하여 MongoDB Search 인덱스 삭제 수 있습니다.

경고

검색 인덱스 및 클러스터 삭제는 돌이킬 수 없습니다.

검색 인덱스 및 관련 클러스터를 삭제하는 것은 영구적인 조치입니다. MongoDB는 삭제된 검색 인덱스 또는 데이터 복구를 지원하지 않습니다. 계속하기 전에 데이터 손실을 방지하기 위해 백업 생성과 같은 적절한 조치를 취했는지 확인하십시오.

MongoDB는 삭제된 검색 인덱스 또는 데이터를 복구하도록 요청하는 것을 지원하지 않습니다. 데이터 무결성과 구성에 대한 책임은 사용자에게 있습니다.

다음 코드에서는 컬렉션에서 검색 인덱스를 삭제하는 방법을 보여줍니다.

collection.dropSearchIndex("<index name>")
.subscribe((result: Unit) => ())

다음 예시 에서는 GeoJSON 객체를 포함하는 지정된 필드 에 2dsphere 인덱스 를 생성합니다.

val observable = collection.createIndex(Indexes.geo2dsphere("<2d index>"))
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

2dsphere 인덱스에 대한 자세한 내용은 MongoDB Server 매뉴얼의 dsphere 인덱스 2가이드 참조하세요.

GeoJSON 유형에 대한 자세한 내용은 MongoDB Server 매뉴얼의 GeoJSON 객체 가이드 참조하세요.

_id 필드에서 기본값 고유 인덱스를 제외한 사용하지 않는 인덱스를 제거할 수 있습니다.

다음 예시 에서는 지정된 이름의 인덱스 를 삭제합니다.

val observable = collection.dropIndex("<index name>")
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

이 가이드 에 사용된 메서드 또는 객체에 대해 자세히 학습 다음 API 설명서를 참조하세요.