Docs Menu
Docs Home
/ / /
C#/ .NET 드라이버
/

Indexes

이 페이지의 내용

  • 개요
  • 쿼리 커버리지 및 성능
  • 운영 고려 사항
  • 인덱스 유형
  • 단일 필드 인덱스
  • 복합 인덱스
  • Multikey Indexes
  • 클러스터화된 인덱스
  • Text Indexes
  • 지리 공간적 인덱스
  • Unique Indexes
  • 와일드카드 인덱스
  • 인덱스 나열

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

Without indexes, MongoDB must scan every document in a collection to find the documents that match each query. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 그러나 쿼리 에 대한 적절한 인덱스 가 있는 경우 MongoDB 는 인덱스 를 사용하여 검사해야 하는 문서를 제한할 수 있습니다.

MongoDB 에 대한 쿼리 를 실행할 때 쿼리 에 다양한 요소가 포함될 수 있습니다.

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

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

  • MongoDB 가 반환할 필드를 지정하는 프로젝션 기준

  • MongoDB 에서 반환되는 문서의 순서를 지정하는 정렬 기준

쿼리, 프로젝션 및 정렬에 지정된 모든 필드가 동일한 인덱스 에 있는 경우, MongoDB 는 해당 인덱스 에서 직접 결과를 반환하며, 이를 커버 쿼리( covered 쿼리)라고도 합니다.

인덱스 가 쿼리 기준 및 프로젝션 을 포함하는지 확인하는 방법에 대한 자세한 내용은 MongoDB 서버 매뉴얼의 커버된 쿼리 섹션을 참조하세요.

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

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

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

MongoDB 는 데이터 쿼리를 지원 하기 위해 여러 가지 인덱스 유형을 제공합니다. 다음 섹션에서는 가장 일반적인 인덱스 유형을 설명하고 각 인덱스 유형을 생성하기 위한 샘플 코드를 제공합니다.

참고

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

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

참고

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

다음 예시 에서는 sample_mflix.movies 컬렉션 내의 title 필드 에 오름차순으로 인덱스 를 생성합니다.

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys.Ascending(m => m.Title));
collection.Indexes.CreateOne(indexModel);

다음은 앞에 설명한 코드 스니펫에서 생성된 인덱스로 처리되는 쿼리의 예입니다.

// Define query parameters
var filter = Builders<Movie>.Filter.Eq(m => m.Title, "Batman");
var sort = Builders<Movie>.Sort.Ascending(m => m.Title);
var projection = Builders<Movie>.Projection.Include(m => m.Title).Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Sort(sort).Project(projection);

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

복합 인덱스 는 컬렉션 문서 내의 여러 필드에 대한 참조를 보유하여 쿼리 및 정렬 성능을 향상시킵니다.

다음 예시 에서는 sample_mflix.movies 컬렉션 내의 typerated 필드에 복합 인덱스 를 생성합니다.

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys
.Ascending(m => m.Type)
.Ascending(m => m.Rated));
collection.Indexes.CreateOne(indexModel);

다음은 앞에 설명한 코드 스니펫에서 생성된 인덱스로 처리되는 쿼리의 예입니다.

// Define query parameters
var typeFilter = Builders<Movie>.Filter.Eq(m => m.Type, "movie");
var ratedFilter = Builders<Movie>.Filter.Eq(m => m.Rated, "G");
var filter = Builders<Movie>.Filter.And(typeFilter, ratedFilter);
var sort = Builders<Movie>.Sort.Ascending(m => m.Type).Ascending(m => m.Rated);
var projection = Builders<Movie>.Projection
.Include(m => m.Type)
.Include(m => m.Rated)
.Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Sort(sort).Project(projection);

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

멀티키 인덱스 는 배열 값이 포함된 필드에서 데이터를 수집하고 정렬합니다. 단일 필드 또는 복합 인덱스 와 동일한 구문을 사용하여 멀티키 인덱스 를 정의할 수 있습니다.

다음 예시 에서는 sample_mflix.movies 컬렉션 내의 rated, genres (문자열 배열 ) 및 title 필드에 복합 멀티키 인덱스 를 생성합니다.

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys
.Ascending(m => m.Rated)
.Ascending(m => m.Genres)
.Ascending(m => m.Title));
collection.Indexes.CreateOne(indexModel);

다음은 앞에 설명한 코드 스니펫에서 생성된 인덱스로 처리되는 쿼리의 예입니다.

// Define query parameters
var genreFilter = Builders<Movie>.Filter.AnyEq(m => m.Genres, "Animation");
var ratedFilter = Builders<Movie>.Filter.Eq(m => m.Rated, "G");
var filter = Builders<Movie>.Filter.And(genreFilter, ratedFilter);
var sort = Builders<Movie>.Sort.Ascending(m => m.Title);
var projection = Builders<Movie>.Projection
.Include(m => m.Title)
.Include(m => m.Rated)
.Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Sort(sort).Project(projection);

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

클러스터형 인덱스 는 키 값을 기준으로 정렬된 문서를 저장 하도록 컬렉션 에 지시합니다. 클러스터형 인덱스 를 만들려면 컬렉션 을 만들 때 _id 필드 를 키로 사용하고 Unique 속성 을 true 로 사용하여 클러스터형 인덱스 옵션을 지정합니다. 컬렉션 에는 클러스터형 인덱스 가 하나만 포함될 수 있습니다. 클러스터형 인덱스 를 만들려면 컬렉션 을 만들 때 지정해야 합니다.

다음 예시 에서는 새 sample_mflix.reviews 컬렉션 을 만드는 동안 _id 필드 에 클러스터형 인덱스 를 만듭니다.

var database = mongoClient.GetDatabase("sample_mflix");
var clusteredIndexOptions = new ClusteredIndexOptions<Review>
{
Key = Builders<Review>.IndexKeys.Ascending(r => r.Id),
Unique = true
};
database.CreateCollection("reviews", new CreateCollectionOptions<Review>
{
ClusteredIndex = clusteredIndexOptions
});

학습 내용은 서버 매뉴얼에서 클러스터형 인덱스클러스터형 컬렉션 을 참조하세요.

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

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

텍스트 인덱스는 Atlas Search 쿼리를 지원 수 없으며, Atlas Search 인덱스는 텍스트 쿼리를 지원 수 없습니다.

다음 예시 에서는 sample_mflix.movies 컬렉션 내의 plot 필드 에 텍스트 인덱스 를 만듭니다.

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys.Text(m => m.Plot));
collection.Indexes.CreateOne(indexModel);

다음 쿼리 는 이전 코드 스니펫에서 생성된 텍스트 인덱스 를 사용합니다.

// Define query parameters
var filter = Builders<Movie>.Filter.Text("java coffee shop");
var projection = Builders<Movie>.Projection.Include(m => m.Plot).Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Project(projection);

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

다음 스니펫은 sample_mflix.movies 컬렉션 내의 titlegenre 필드에 대한 복합 텍스트 인덱스 를 생성합니다.

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys
.Text(m => m.Title)
.Text(m => m.Genre));
collection.Indexes.CreateOne(indexModel);

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

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

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

sample_mflix.theaters 컬렉션 의 다음 샘플 문서 에 있는 location.geo 필드 는 극장의 좌표를 설명하는 GeoJSON 포인트 객체 입니다.

{
"_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 인덱스를 생성합니다.

중요

이미 지리 공간적 인덱스로 포함된 필드에 지리 공간적 인덱스를 생성하려고 하면 오류가 발생합니다.

var indexModel = new CreateIndexModel<Theater>(Builders<Theater>.IndexKeys.Geo2DSphere(t => t.Location.Geo));
collection.Indexes.CreateOne(indexModel);

예시 위치 쿼리 " 인덱스:

// Stores the coordinates of the NY MongoDB headquarters
var refPoint = GeoJson.Point(GeoJson.Position(-73.98456, 40.7612));
// Creates a filter to match documents that represent locations up to 1000 meters from the specified point directly from the geospatial index
var filter = Builders<Theater>.Filter.Near(m => m.Location.Geo, refPoint, 1000.0, 0.0);
// Execute the query
var results = collection.Find(filter);

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

고유 인덱스 는 인덱싱된 필드에 중복된 값이 저장 되지 않도록 합니다. 기본값 으로 MongoDB 는 컬렉션 을 만드는 동안 _id 필드 에 고유 인덱스 를 만듭니다. 고유 인덱스 를 만들려면 중복을 방지할 필드를 설정하다 하고 Unique 옵션을 true 로 설정합니다.

다음 예시 에서는 sample_mflix.theaters 컬렉션 내의 theaterId 필드 에 고유한 내림차순 인덱스 를 생성합니다.

var options = new CreateIndexOptions { Unique = true };
var indexModel = new CreateIndexModel<Theater>(Builders<Theater>.IndexKeys.Descending(t => t.TheaterId),
options);
collection.Indexes.CreateOne(indexModel);

고유 인덱스를 위반하는 중복 값을 저장하는 쓰기 작업을 시도할 경우, MongoDB는 다음과 같은 오류를 발생시킵니다.

E11000 duplicate key error index

학습 내용은 서버 매뉴얼의 고유 인덱스 를 참조하세요.

와일드카드 인덱스 를 활성화 합니다. 이러한 인덱스는 동적 스키마 를 사용하는 경우 유용할 수 있습니다.

다음 예시 에서는 하위 문서 및 배열에 중첩된 값을 포함하여 sample_mflix.theaters 컬렉션 내 location 필드 의 모든 값에 대해 오름차순 와일드카드 인덱스 를 만듭니다.

var indexModel = new CreateIndexModel<Theater>(Builders<Theater>.IndexKeys.Wildcard(t => t.Location));
collection.Indexes.CreateOne(indexModel);

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

List() 메서드를 사용하여 컬렉션 에서 인덱스 목록을 조회 할 수 있습니다.

다음 예시 에서는 List() 메서드를 사용하여 컬렉션 의 모든 인덱스를 나열합니다.

var indexes = collection.Indexes.List();
foreach (var index in indexes.ToList())
{
Console.WriteLine(index);
}

돌아가기

트랜잭션