문서 메뉴
문서 홈
/ / /
C#/.NET
/

색인

이 페이지의 내용

  • 개요
  • 쿼리 커버리지 및 성능
  • 운영 고려 사항
  • 인덱스 유형
  • 단일 필드 인덱스
  • 복합 인덱스
  • 멀티키 인덱스
  • 클러스터화된 인덱스
  • Atlas search 인덱스
  • 텍스트 인덱스
  • 지리 공간적 인덱스
  • 고유 인덱스
  • 와일드카드 인덱스
  • 인덱스 나열

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

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

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

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

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

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

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

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

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

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

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

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

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

참고

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

단일 필드 인덱스 는 컬렉션 문서 내의 단일 필드에 대한 참조가 있는 인덱스입니다. 단일 필드 쿼리 및 정렬 성능을 개선하고, 일정 시간 후 또는 특정 시계 시간에 컬렉션에서 문서를 자동으로 제거하는 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
});

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

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

MongoDB Atlas Search에 대해 자세히 알아보려면 Atlas Search 인덱스 문서를 참조하세요.

참고

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

다음 섹션에는 Atlas Search 인덱스를 생성하고 인덱스와 상호 작용하는 방법을 보여주는 튜토리얼 링크가 포함되어 있습니다.

Atlas 컬렉션에서 검색을 수행하려면 먼저 컬렉션에 Atlas Search 인덱스를 생성해야 합니다. .NET/C# 드라이버를 사용하여 Atlas Search 인덱스를 만드는 방법을 알아보려면 Atlas 매뉴얼의 Atlas Search 인덱스 만들기 를 참조하고 언어 드롭다운에서 C# 를 선택합니다.

.NET/C# 드라이버를 사용하여 Atlas Search 인덱스 목록을 보는 방법을 알아보려면 Atlas 매뉴얼에서 Atlas Search 인덱스 보기 를 참조하고 언어 드롭다운에서 C# 를 선택합니다.

.NET/C# 드라이버를 사용하여 기존 Atlas Search 인덱스를 수정하는 방법을 알아보려면 Atlas 매뉴얼의 Atlas Search 인덱스 편집 을 참조하고 언어 드롭다운에서 C# 를 선택합니다.

.NET/C# 드라이버를 사용하여 Atlas Search 인덱스를 삭제하는 방법을 알아보려면 Atlas 매뉴얼의 Atlas Search 인덱스 삭제 를 참조하고 언어 드롭다운에서 C# 를 선택합니다.

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

MongoDB는 향상된 전체 텍스트 검색 솔루션인 Atlas Search 를 제공합니다. Atlas Search 인덱스 및 사용 방법에 대해 자세히 알아보려면 이 가이드의 Atlas 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 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 인덱스를 생성합니다.

중요

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

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

다음은 'location.geo' 인덱스를 사용하는 지리 공간적 쿼리의 예입니다.

// 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);
}

돌아가기

트랜잭션

다음

로깅