Indexes
이 페이지의 내용
개요
이 가이드에서는 Rust 드라이버를 사용하여 인덱스를 만들고 관리하는 방법을 배울 수 있습니다. 인덱스는 MongoDB에서 쿼리 성능을 향상시키는 특수 데이터 구조입니다.
인덱스 없이 컬렉션에 대해 쿼리를 수행하면 MongoDB는 모든 문서를 검색하여 일치하는 항목을 찾습니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 쿼리를 포함하는 인덱스를 생성하면 MongoDB는 일치 항목을 찾기 위해 검사하는 문서 수를 제한하므로 성능이 향상됩니다.
팁
업데이트 작업, 삭제 작업 및 일부 집계 파이프라인 단계에서 인덱스를 사용할 수 있습니다. 애그리게이션에서 인덱스를 사용하는 방법에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 인덱스 및 문서 필터로 성능 향상 을 참조하세요.
쿼리 커버리지 및 성능
다음 표에서는 MongoDB 쿼리에 포함할 수 있는 요소에 대해 설명합니다.
요소 | 설명 |
---|---|
쿼리 | Required Specifies the fields and values to match |
옵션 | Optional Specify how the query executes |
프로젝션 | Optional Specifies the fields that MongoDB returns in matched
documents |
Sort | Optional Specifies the order of documents returned |
쿼리 요소가 모두 동일한 인덱스에 포함된 필드를 참고하는 경우 MongoDB는 인덱스에서 직접 결과를 반환할 수 있습니다. 이러한 쿼리를 포함된 쿼리 라고 합니다.
인덱스 가 쿼리를 포함하는지 확인하는 방법을 학습 보려면 서버 매뉴얼에서 커버드 쿼리 쿼리 참조하세요.
중요
정렬 기준
정렬 기준은 인덱스의 순서와 일치하거나 반전되어야 합니다.
Suppose a collection이 오름차순(AZ)의 name
필드에 다음과 같은 인덱스가 있고 내림차순(9-0)의 age
필드에 대한 인덱스가 있다고 가정합니다.
name_1_age_-1
MongoDB는 다음 구성 중 하나로 문서를 정렬할 때 이 인덱스를 사용합니다.
name
오름차순,age
내림차순name
내림차순,age
오름차순
두 필드에 동일한 정렬 순서를 지정하는 경우 MongoDB는 인덱스를 사용하지 않고 대신 인메모리 정렬을 수행합니다.
운영 고려 사항
쿼리 성능을 향상시키려면 쿼리에 자주 나타나는 필드에 인덱스를 생성합니다. 그러나 각 인덱스는 디스크 공간과 메모리를 사용하므로 용량 계획을 위해 인덱스 메모리와 디스크 사용량을 추적하는 것이 좋습니다. 또한 쓰기 작업이 인덱싱된 필드를 업데이트하는 경우 MongoDB는 관련 인덱스도 업데이트해야 합니다.
MongoDB는 동적 스키마를 지원하므로 애플리케이션에서 이름을 알 수 없거나 변수 이름이 있는 필드를 쿼리할 수 있습니다. MongoDB Server 버전 4.2 이상에 연결된 경우 이러한 쿼리를 지원하는 와일드카드 인덱스를 생성할 수 있습니다. 이 인덱스 유형에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 와일드카드 인덱스 를 참조하세요.
인덱스 유형
MongoDB는 쿼리를 지원하기 위해 여러 인덱스 유형을 지원합니다. 다음 섹션에서는 일반적인 인덱스 유형을 설명하고 collection에서 각 인덱스 유형을 만드는 방법을 보여줍니다.
참고
샘플 collection
이 가이드의 예제에서는 Atlas 샘플 데이터의 컬렉션을 사용합니다. 이 데이터를 가져오는 방법을 알아보려면 Atlas 설명서에서 샘플 데이터 로드 튜토리얼을 참조하세요.
create_index()
및 create_indexes()
메서드를 사용하여 collection에 인덱스를 만들 수 있습니다. create_index()
메서드는 유형의 builder()
메서드를 사용하여 구성할 수 있는 IndexModel
구조체 매개변수를 사용합니다.
인덱스 유형의 전체 목록을 보려면 MongoDB Server 매뉴얼의 인덱스 유형을 참조하세요.
단일 필드 인덱스
단일 필드 인덱스에는 문서 필드에 대한 참고가 있습니다.
이 인덱스 는 단일 필드 쿼리 및 정렬의 성능을 향상시킵니다. 또한 일정 시간이 지나면 컬렉션 에서 문서를 자동으로 제거 하는 TTL 인덱스를 지원합니다. TTL 인덱스에 학습 보려면 서버 매뉴얼의 TTL TTL 를 참조하세요.
새 컬렉션을 생성하면 MongoDB는 _id
필드에 고유한 단일 필드 인덱스를 자동으로 생성합니다.
예시
다음 코드는 sample_training.zips
collection의 city
필드에 오름차순 인덱스를 생성합니다.
let index = IndexModel::builder().keys(doc! { "city": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1
복합 인덱스
복합 인덱스에는 여러 문서 필드에 대한 참조가 있습니다.
이 인덱스는 쿼리 성능을 향상시키고 여러 필드에 대한 정렬을 수행합니다. 복합 인덱스를 생성할 때는 인덱싱된 각 필드에 대한 방향을 지정해야 합니다.
단일 필드 인덱스를 생성할 때와 동일한 구문을 사용하여 멀티키 인덱스를 생성할 수 있습니다.
예시
다음 코드는 sample_training.zips
collection의 city
및 pop
필드에 복합 인덱스를 생성합니다.
let index = IndexModel::builder() .keys(doc! { "city": 1, "pop": -1 }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: city_1_pop_-1
멀티키 인덱스(배열 필드 인덱스)
멀티키 인덱스에는 배열 값 필드에 대한 참고가 들어 있습니다. 이 인덱스는 배열 필드에 대한 쿼리 성능을 향상시킵니다.
단일 필드 인덱스를 생성할 때와 동일한 구문을 사용하여 멀티키 인덱스를 생성할 수 있습니다.
예시
다음 코드는 sample_training.posts
collection의 tags
필드에 멀티키 인덱스를 생성합니다.
let index = IndexModel::builder().keys(doc! { "tags": 1 }).build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: tags_1
클러스터화된 인덱스
클러스터형 인덱스는 클러스터형 컬렉션에 대한 삽입, 업데이트, 삭제 작업의 성능을 향상시킵니다. 클러스터형 컬렉션은 클러스터형 인덱스 키 값을 기준으로 정렬된 문서를 저장합니다. 이러한 컬렉션에 대해 자세히 알아보려면 서버 매뉴얼의 클러스터형 컬렉션을 참조하세요.
클러스터형 인덱스는 collection을 만들 때만 만들 수 있습니다. 클러스터형 컬렉션을 만들려면 다음 단계를 수행하세요.
ClusteredIndex
인스턴스를 만듭니다.create_collection()
메서드를 호출합니다.clustered_index()
메서드를create_collection()
메서드에 연결하여ClusteredIndex
인스턴스 를clustered_index()
의 매개변수로 전달합니다.
ClusteredIndex
구조체의 다음 필드를 설정해야 합니다.
키 패턴을 지정하는
key
필드입니다. 이 필드의 값은{ _id: 1 }
이어야 합니다.인덱스의 고유성을 지정하는
unique
필드입니다. 이 필드의 값은true
이어야 합니다.
필수 값을 자동으로 사용하는 ClusteredIndex
인스턴스를 만들려면 유형의 default()
메서드를 호출하면 됩니다.
예시
다음 코드는 sample_training
데이터베이스에 items
라는 새 collection을 생성할 때 _id
필드에 기본 구성으로 클러스터형 인덱스를 생성합니다.
let db = client.database("sample_training"); let cl_idx = ClusteredIndex::default(); db.create_collection("items") .clustered_index(cl_idx) .await?;
Text Indexes
텍스트 인덱스는 문자열 콘텐츠에 대한 텍스트 검색 쿼리를 지원합니다. 이 인덱스는 문자열 값 또는 문자열 배열 값이 있는 필드를 참고합니다. MongoDB는 여러 언어에 대한 텍스트 검색을 지원합니다. 텍스트 인덱스를 생성할 때 기본 언어를 옵션으로 지정할 수 있습니다.
컬렉션에는 텍스트 인덱스가 하나만 포함될 수 있습니다. 여러 텍스트 필드에 텍스트 인덱스를 만들려면 복합 인덱스 를 만들면 됩니다. 복합 인덱스를 생성한 후 텍스트 Atlas Search를 실행하면 Atlas Search 작업이 복합 인덱스의 모든 텍스트 필드에서 실행됩니다.
팁
Atlas Full Text Search
텍스트 인덱스는 Atlas Full Text Search 인덱스와 다릅니다. Atlas Search 인덱스에 학습 보려면 Atlas Search 인덱스 가이드 를 참조하세요.
예시
다음 코드는 sample_training.posts
collection의 body
필드에 텍스트 인덱스를 생성합니다. 이 코드는 "spanish"
를 텍스트 인덱스의 기본 언어로 지정하는 옵션을 설정합니다.
let idx_opts = IndexOptions::builder() .default_language("spanish".to_string()) .build(); let index = IndexModel::builder() .keys(doc! { "body": "text" }) .options(idx_opts) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: body_"text"
지리 공간적 인덱스
MongoDB는 2dsphere
인덱스를 사용하여 지리 공간 좌표 데이터가 포함된 쿼리를 지원합니다. GeoJSON 객체 값이 있는 필드에 2dsphere
인덱스를 생성할 수 있습니다.
이 인덱스 유형은 다음 작업을 지원합니다.
포함, 교차 및 근접성을 찾기 위한 지리 공간적 데이터 쿼리
유클리드 평면에서 거리 계산
중요
동일한 필드에 두 개의 지리 공간적 인덱스를 만들 수 없습니다.
예시
sample_mflix.theaters
collection의 다음 샘플 문서에는 location.geo
필드가 포함되어 있습니다. 이 필드에는 GeoJSON 포인트 값이 있습니다.
{ "_id": ..., "theaterId": ..., "location": { "address": ..., "geo": { "type": "Point", "coordinates": [ -93.24565, 44.85466 ] } } }
다음 코드는 sample_mflix.theaters
collection의 location.geo
필드에 지리 공간적 2dsphere
인덱스를 생성합니다.
let index = IndexModel::builder() .keys(doc! { "location.geo": "2dsphere" }) .build(); let idx = my_coll.create_index(index).await?; println!("Created index:\n{}", idx.index_name);
Created index: location.geo_"2dsphere"
Unique Indexes
고유 인덱스는 인덱싱된 필드에 중복된 값이 저장되지 않도록 합니다. 기본적으로 MongoDB는 collection 생성 시 _id
필드에 고유한 단일 필드 인덱스를 생성합니다.
고유 인덱스를 생성하려면 고유성을 유지하려는 필드 또는 필드 조합을 지정하고 unique
옵션을 true
로 설정합니다.
예시
다음 코드는 IndexOptions
인스턴스에서 unique
필드를 true
로 설정하고 IndexModel
를 만들 때 이러한 옵션을 전달하는 방법을 보여줍니다.
let opts = IndexOptions::builder().unique(true).build(); let index = IndexModel::builder() .keys(doc! { "_id": -1 }) .options(opts) .build();
인덱스 제거
_id
필드의 기본 고유 인덱스를 제외한 컬렉션에서 모든 인덱스를 제거하거나 삭제할 수 있습니다. 인덱스를 제거하려면 drop_index()
메서드에 인덱스 이름을 전달합니다.
팁
모든 인덱스 제거
drop_indexes()
메서드를 사용하여 _id
인덱스를 제외한 collection의 모든 인덱스를 한 번에 제거할 수 있습니다.
다음 예에서는 city_1
sample_training.zips
collection에서 (이)라는 인덱스를 제거합니다.
my_coll.drop_index("city_1".to_string()).await?;
추가 정보
데이터 모델을 설계하고 애플리케이션에 적합한 인덱스를 만드는 방법에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 인덱싱 전략 및 운영 요인 및 데이터 모델 을 참조하세요.
읽기 작업 수행에 대한 자세한 내용은 읽기 작업 카테고리의 가이드를 참조하세요.
이 가이드에 언급된 개념에 대해 자세히 알아보려면 다음 서버 설명서를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.