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.movies
및 sample_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
컬렉션 내의 type
및 rated
필드에 복합 인덱스 를 생성합니다.
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);
자세한 내용은 서버 매뉴얼의 복합 인덱스 를 참조하세요.
Multikey Indexes
멀티키 인덱스 는 배열 값이 포함된 필드에서 데이터를 수집하고 정렬합니다. 단일 필드 또는 복합 인덱스 와 동일한 구문을 사용하여 멀티키 인덱스 를 정의할 수 있습니다.
다음 예시 에서는 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 인덱스
Atlas Search 기능을 사용하면 MongoDB Atlas에서 호스팅되는 컬렉션에서 전체 텍스트 검색을 수행할 수 있습니다. 인덱스는 검색 동작과 인덱싱할 필드를 지정합니다.
MongoDB Atlas Search에 대해 자세히 학습하려면 Atlas Search Indexes 문서를 참조합니다.
참고
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# 를 선택합니다.
Text Indexes
텍스트 인덱스 는 문자열 콘텐츠에 대한 텍스트 검색 쿼리를 지원합니다. 이러한 인덱스에는 값이 문자열 혹은 문자열 요소의 배열인 필드가 있을 수 있습니다. MongoDB는 다양한 언어에 대해 텍스트 검색을 지원합니다. 인덱스를 생성하는 경우 기본값 언어를 옵션으로 지정할 수 있습니다.
팁
MongoDB는 향상된 풀텍스트 검색 솔루션인 Atlas Search를 제공합니다. Atlas Search 인덱스 및 사용 방법에 대해 자세히 학습하려면 본 가이드의 Atlas Search Indexes 섹션을 참조합니다.
텍스트 인덱스는 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
컬렉션 내의 title
및 genre
필드에 대한 복합 텍스트 인덱스 를 생성합니다.
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 를 참조하세요.
Unique Indexes
고유 인덱스 는 인덱싱된 필드에 중복된 값이 저장 되지 않도록 합니다. 기본값 으로 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); }