Docs Menu

Indexes

이 가이드 에서는 PyMongo 에서 인덱스 를 사용하는 방법을 학습 수 있습니다. 인덱스는 쿼리의 효율성 을 높이고 문서 쿼리 및 저장에 추가 기능을 추가할 수 있습니다.

인덱스가 없으면 MongoDB는 컬렉션의 모든 문서를 스캔하여 각 쿼리와 일치하는 문서를 찾아야 합니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 그러나 쿼리에 적합한 인덱스가 있는 경우 MongoDB는 인덱스를 사용하여 검사해야 하는 문서를 제한할 수 있습니다.

쿼리 성능을 향상시키려면 애플리케이션의 쿼리와 정렬된 결과를 반환하는 작업에 자주 나타나는 필드에 인덱스를 작성합니다. 추가하는 각 인덱스가 활성화되면 디스크 공간과 메모리를 사용하므로 용량 계획을 위해 인덱스 메모리와 디스크 사용량을 추적해야 합니다. 또한 쓰기 작업이 인덱스된 필드를 업데이트할 때는 MongoDB가 관련 인덱스도 업데이트해야 합니다.

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

데이터 모델 을 설계하고 애플리케이션 에 적합한 인덱스를 선택하는 방법에 대한 자세한 내용은 MongoDB Server 매뉴얼의 데이터 모델링 및 인덱스 가이드 를 참조하세요.

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

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

참고

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

다음 예시 title 필드 에 오름차순으로 인덱스 생성합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

movies.create_index("title")
await movies.create_index("title")

다음은 앞의 코드 예제에서 생성된 인덱스가 다루는 쿼리의 예입니다.

query = { "title": "Batman" }
sort = [("title", 1)]
cursor = movies.find(query).sort(sort)

자세한 내용은 MongoDB Server 매뉴얼의 단일 필드 인덱스 를 참조하세요.

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

다음 예시 typegenre 필드에 복합 인덱스 생성합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

movies.create_index([("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)])
await movies.create_index([("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)])

다음은 앞의 코드 예제에서 생성된 인덱스를 사용하는 쿼리의 예입니다.

query = { "type": "movie", "genre": "Drama" }
sort = [("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)]
cursor = movies.find(query).sort(sort)

자세한 내용은 MongoDB 서버 매뉴얼에서 복합 인덱스를 참조하세요.

멀티키 인덱스는 배열 값을 포함하는 인덱스 로 필드 지정하는 쿼리의 성능을 향상시키는 인덱스입니다. 단일 필드 또는 복합 인덱스 와 동일한 구문을 사용하여 멀티키 인덱스 정의할 수 있습니다.Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

다음 예시 cast 필드 에 멀티키 인덱스 생성합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

result = movies.create_index("cast")
result = await movies.create_index("cast")

다음은 앞의 코드 예제에서 생성된 인덱스를 사용하는 쿼리의 예입니다.

query = { "cast": "Viola Davis" }
cursor = movies.find(query)

멀티키 인덱스는 쿼리 커버리지, 인덱스 바운드 계산 및 정렬 동작 측면에서 다른 인덱스와 다르게 작동합니다. 멀티키 인덱스의 동작과 제한 사항에 대한 논의를 포함하여 멀티키 인덱스에 대해 자세히 학습하려면 MongoDB Server 매뉴얼의 멀티키 인덱스 가이드를 참조하세요.

PyMongo를 사용하여 Atlas SearchAtlas Vector Search 검색 인덱스를 관리할 수 있습니다. 인덱스는 검색 동작과 인덱싱할 필드를 지정합니다.

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

Atlas Vector Search를 사용하면 MongoDB Atlas에 저장된 벡터 임베딩에 대해 시맨틱 검색을 수행할 수 있습니다. 벡터 검색 인덱스는 쿼리하려는 벡터 임베딩에 대한 인덱스와 데이터를 사전 필터링하는 데 사용할 부울, 날짜, objectId, 숫자, 문자열 또는 UUID 값을 정의합니다.

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

  • create_search_index()

  • create_search_indexes()

  • list_search_indexes()

  • update_search_index()

  • drop_search_index()

참고

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

다음 섹션에서는 코드 예시를 제공하여 이전의 각 메서드를 사용하는 방법을 보여줍니다.

create_search_index()create_search_indexes() 메서드를 사용하여 Atlas 검색 인덱스 또는 Atlas Vector Search 인덱스를 만들 수 있습니다.

다음 코드 예시 단일 Atlas Search 인덱스 생성하는 방법을 보여줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

index = {
"definition": {
"mappings": {
"dynamic": True
}
},
"name": "<index name>",
}
collection.create_search_index(index)
index = {
"definition": {
"mappings": {
"dynamic": True
}
},
"name": "<index name>",
}
await collection.create_search_index(index)

다음 코드 예시 SearchIndexModel 객체 사용하여 단일 Atlas Vector Search 인덱스 만드는 방법을 보여줍니다.Synchronous 또는 탭 Asynchronous 선택하여 해당 코드를 확인합니다.

from pymongo.operations import SearchIndexModel
search_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="<index name>",
type="vectorSearch",
)
collection.create_search_index(model=search_index_model)
from pymongo.operations import SearchIndexModel
search_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="<index name>",
type="vectorSearch",
)
await collection.create_search_index(model=search_index_model)

create_search_indexes() 메서드를 사용하여 여러 인덱스를 만들 수 있습니다. 이러한 인덱스는 Atlas Search 또는 Vector Search 인덱스가 될 수 있습니다. create_search_indexes() 메서드는 생성하려는 각 인덱스에 해당하는 SearchIndexModel 객체 목록을 사용합니다.

다음 코드 예시 Atlas Search 인덱스 와 Atlas Vector Search 인덱스 만드는 방법을 보여 줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

search_idx = SearchIndexModel(
definition ={
"mappings": {
"dynamic": True
}
},
name="my_index",
)
vector_idx = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="my_vector_index",
type="vectorSearch",
)
indexes = [search_idx, vector_idx]
collection.create_search_indexes(models=indexes)
search_idx = SearchIndexModel(
definition ={
"mappings": {
"dynamic": True
}
},
name="my_index",
)
vector_idx = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="my_vector_index",
type="vectorSearch",
)
indexes = [search_idx, vector_idx]
await collection.create_search_indexes(models=indexes)

list_search_indexes() 메서드를 사용하여 컬렉션의 Atlas Search 및 Vector Search 인덱스에 대한 정보를 얻을 수 있습니다.

다음 코드 예시 컬렉션 의 검색 인덱스 목록을 인쇄하는 방법을 보여 줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

results = list(collection.list_search_indexes())
for index in results:
print(index)
results = await (await collection.list_search_indexes()).to_list()
async for index in results:
print(index)

update_search_index() 메서드를 사용하여 Atlas Search 또는 Vector Search 인덱스를 업데이트할 수 있습니다.

다음 코드 예시 Atlas Search 인덱스 업데이트 방법을 보여줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

new_index_definition = {
"mappings": {
"dynamic": False
}
}
collection.update_search_index("my_index", new_index)

다음 코드 예시 Atlas Vector Search 인덱스 업데이트 방법을 보여줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

new_index_definition = {
"fields": [
{
"type": "vector",
"numDimensions": 1536,
"path": "<field to index>",
"similarity": "euclidean"
},
]
}
collection.update_search_index("my_vector_index", new_index_definition)
new_index_definition = {
"fields": [
{
"type": "vector",
"numDimensions": 1536,
"path": "<field to index>",
"similarity": "euclidean"
},
]
}
await collection.update_search_index("my_vector_index", new_index_definition)

drop_search_index() 메서드를 사용하여 Atlas Search 또는 Vector Search 인덱스를 제거할 수 있습니다.

다음 코드는 컬렉션 에서 검색 인덱스 삭제 방법을 보여줍니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

collection.drop_search_index("my_index")
await collection.drop_search_index("my_index")

텍스트 인덱스 는 문자열 콘텐츠에 대한 텍스트 검색 쿼리를 지원합니다. 이러한 인덱스에는 값이 문자열 혹은 문자열 요소의 배열인 필드가 있을 수 있습니다. MongoDB는 다양한 언어에 대해 텍스트 검색을 지원합니다. 인덱스를 생성하는 경우 기본값 언어를 옵션으로 지정할 수 있습니다.

MongoDB 향상된 전체 텍스트 검색 솔루션인 Atlas Search 제공합니다. Atlas Search 인덱스 및 사용 방법에 대해 자세히 학습 이 페이지의 Atlas Search 및 Vector Search 인덱스 섹션을 참조하세요.

다음 예시 plot 필드 에 텍스트 인덱스 생성합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

movies.create_index(
[( "plot", "text" )]
)
await movies.create_index(
[( "plot", "text" )]
)

다음은 앞의 코드 예제에서 생성된 인덱스를 사용하는 쿼리의 예입니다.

query = { "$text": { "$search": "a time-traveling DeLorean" } }
cursor = movies.find(query)

컬렉션 에는 텍스트 인덱스 가 하나만 포함될 수 있습니다. 여러 텍스트 필드에 대한 텍스트 인덱스 를 생성하려면 복합 인덱스 를 생성합니다. 텍스트 검색 은 복합 인덱스 내의 모든 텍스트 필드에서 실행됩니다.

다음 예시 titlegenre 필드에 대한 복합 텍스트 인덱스 만듭니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

from pymongo.collation import Collation
result = myColl.create_index(
[("title", "text"), ("genre", "text")],
default_language="english",
weights={ "title": 10, "genre": 3 },
collation=Collation(locale='fr_CA')
)
from pymongo.collation import Collation
result = await myColl.create_index(
[("title", "text"), ("genre", "text")],
default_language="english",
weights={ "title": 10, "genre": 3 },
collation=Collation(locale='fr_CA')
)

자세한 내용은 MongoDB Server 매뉴얼의 복합 텍스트 인덱스 제한텍스트 인덱스 를 참조하세요.

MongoDB는 2dsphere 인덱스를 사용하여 지리 공간적 좌표 데이터 쿼리를 지원합니다. 2dsphere 인덱스를 사용하면 지리 공간적 데이터에 포함, 교차 및 근접성 등을 쿼리할 수 있습니다. 지리공간 데이터 쿼리에 대한 자세한 내용은 지리공간 쿼리를 참조하세요.

2dsphere 인덱스를 만들려면 GeoJSON 객체 만 포함하는 필드를 지정해야 합니다. 이 유형에 대한 자세한 내용은 MongoDB Server 매뉴얼의 GeoJSON 객체 가이드를 참조하세요.

sample_mflix 데이터베이스의 theaters 컬렉션에 있는 다음과 같은 샘플 문서의 location.geo 필드는 시어터의 좌표를 설명하는 GeoJSON Point 객체입니다.

{
"_id" : ObjectId("59a47286cfa9a3a73e51e75c"),
"theaterId" : 104,
"location" : {
"address" : {
"street1" : "5000 W 147th St",
"city" : "Hawthorne",
"state" : "CA",
"zipcode" : "90250"
},
"geo" : {
"type" : "Point",
"coordinates" : [
-118.36559,
33.897167
]
}
}
}

다음 예시 location.geo 필드 에 2dsphere 인덱스 생성합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

theaters.create_index(
[( "location.geo", "2dsphere" )]
)
await theaters.create_index(
[( "location.geo", "2dsphere" )]
)

MongoDB 또한 2d 는 유클리드 평면에서 거리를 계산하고legacy coordinate pairs MongoDB 2.2 이전 버전에서 사용되는 " " 구문으로 작업하기 위한 인덱스를 지원합니다. 자세한 내용은 MongoDB Server 매뉴얼의 지리 공간적 쿼리 가이드 를 참조하세요.

고유 인덱스는 인덱싱된 필드에 중복된 값이 저장되지 않도록 합니다. 기본적으로 MongoDB는 컬렉션 생성 중에 _id 필드에 고유 인덱스를 생성합니다. 고유 인덱스를 만들려면 다음 단계를 수행하세요.

  • 중복을 방지할 필드 또는 필드 조합을 지정합니다.

  • unique 옵션을 ``True``로 설정합니다.

다음 예시 theaterId 필드 에 내림차순 고유 인덱스 생성합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

theaters.create_index("theaterId", unique=True)
await theaters.create_index("theaterId", unique=True)

자세한 내용은 MongoDB Server 매뉴얼의 고유 인덱스 가이드를 참조하세요.

와일드카드 인덱스를 활성화하면 알 수 없거나 임의의 필드에 대한 쿼리가 가능합니다. 이러한 인덱스는 동적 스키마를 사용하는 경우 유용할 수 있습니다.

다음 예시 하위 문서 및 배열에 중첩된 값을 포함하여 location 필드 의 모든 값에 대해 오름차순 와일드카드 인덱스 만듭니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

movies.create_index({ "location.$**": pymongo.ASCENDING })
await movies.create_index({ "location.$**": pymongo.ASCENDING })

자세한 내용은 MongoDB Server 매뉴얼의 와일드카드 인덱스 페이지를 참조하세요.

클러스터형 인덱스 는 키 값을 기준으로 정렬된 문서를 저장하도록 컬렉션에 지시합니다. 클러스터형 인덱스를 만들려면 컬렉션을 만들 때 다음 단계를 수행하세요.

  • _id 필드 를 키로 사용하여 클러스터형 인덱스 옵션을 지정합니다.

  • 고유 필드를 True 으로 설정합니다.

다음 예시 새 movie_reviews 컬렉션 의 _id 필드 에 클러스터형 인덱스 만듭니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

sample_mflix.create_collection("movies", clusteredIndex={
"key": { "_id": 1 },
"unique": True
})
await sample_mflix.create_collection("movies", clusteredIndex={
"key": { "_id": 1 },
"unique": True
})

자세한 내용은 MongoDB Server 매뉴얼의 클러스터형 인덱스클러스터형 컬렉션 섹션을 참조하세요.

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

다음 섹션에서는 단일 인덱스 를 제거 하거나 컬렉션 의 모든 인덱스를 제거 하는 방법을 보여 줍니다.

컬렉션 에서 인덱스 를 제거 하려면 인덱스 의 인스턴스 또는 인덱스 이름을 drop_index() 메서드에 전달합니다.

다음 예시 movies 컬렉션 에서 이름이 "_title_" 인 인덱스 제거합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

movies.drop_index("_title_")
await movies.drop_index("_title_")

참고

복합 텍스트 인덱스에서 단일 필드를 제거할 수 없습니다. 인덱스된 필드를 업데이트하려면 인덱스를 전부 제거하고 새로운 인덱스를 생성해야 합니다.

MongoDB 4.2부터는 컬렉션 에서 drop_indexes() 메서드를 호출하여 모든 인덱스를 삭제할 수 있습니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.

collection.drop_indexes()
await collection.drop_indexes()

이전 버전의 MongoDB의 경우 컬렉션의 drop_index() 에 대한 호출에 "*" 를 매개 변수로 전달합니다.

collection.drop_index("*")
await collection.drop_index("*")

고유 인덱스 를 위반하는 중복 값을 저장하는 쓰기 작업을 수행하면 드라이버에서 DuplicateKeyException 가 발생하고 MongoDB에서 다음과 유사한 오류가 발생합니다.

E11000 duplicate key error index

MongoDB 의 인덱스에 학습 보려면 MongoDB Server 매뉴얼의 인덱스 가이드 를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.