개요
이 가이드에서는 EF Core Provider에서 인덱스 를 정의하는 방법을 학습 수 있습니다. 인덱스는 쿼리의 효율성 높이고 문서 쿼리 및 저장에 추가 기능을 추가할 수 있습니다.
인덱스가 없으면 MongoDB 각 쿼리 와 일치하는 문서를 찾기 위해 컬렉션 의 모든 문서 스캔해야 합니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 그러나 쿼리 다루는 인덱스 생성하는 경우 MongoDB 인덱스 사용하여 검사해야 하는 문서를 제한할 수 있습니다.
쿼리 성능을 향상시키려면 애플리케이션의 쿼리와 정렬된 결과를 반환하는 작업에 자주 나타나는 필드에 인덱스를 생성합니다. 추가하는 각 인덱스가 활성화되면 디스크 공간과 메모리를 사용하므로 용량 계획을 위해 인덱스 메모리와 디스크 사용량을 추적해야 합니다.
인덱스 만들기
EF Core Provider는 다음 유형의 인덱스를 지원합니다.
이 가이드의 예제에서는 빠른 시작 가이드에서 만든 샘플 애플리케이션 사용합니다. 빠른 시작 애플리케이션 설정하다 한 후 다음 예시 와 같이 PlanetDbContext
의 OnModelCreating()
메서드에 코드를 추가하여 이 가이드 의 예제를 실행 수 있습니다.
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Paste example code here }
참고
EF Core Provider는 dbContext.Database.EnsureCreated()
메서드를 호출할 때 인덱스를 생성합니다. 인덱스를 생성한 후에는 제공자 사용하여 인덱스를 수정하거나 삭제 수 없습니다. 애플리케이션 에서 인덱스 수정하거나 삭제 해야 하는 경우 .NET/ C# 드라이버 직접 사용해야 합니다.
운전자 에서 인덱스 작업에 대해 자세히 학습 .NET/ C# 드라이버 설명서의 인덱스 가이드 참조하세요.
다음 섹션에서는 앞의 각 유형의 인덱스를 만드는 방법을 보여줍니다.
단일 필드 인덱스
단일 필드 인덱스 는 컬렉션 문서 내의 단일 필드에 대한 참조가 있는 인덱스입니다. 단일 필드 쿼리 및 정렬 성능을 향상시킵니다. _id_
인덱스 는 단일 필드 인덱스 의 예시 입니다.
인덱스 할 필드 지정하는 Lambda 표현식 사용하여 HasIndex()
메서드를 호출하여 단일 필드 인덱스 만들 수 있습니다. 다음 예시 Planet
엔터티에 단일 필드 인덱스 만듭니다.
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun); p.ToCollection("planets"); });
복합 인덱스
복합 인덱스 는 컬렉션 문서 내의 여러 필드를 포함하는 인덱스입니다. 이러한 인덱스는 다중 필드 쿼리 및 정렬 성능을 향상시킵니다.
인덱스 할 필드를 지정하는 Lambda 표현식 으로 HasIndex()
메서드를 호출하여 복합 인덱스 만들 수 있습니다. 다음 예시 Planet
엔터티에 복합 인덱스 생성합니다.
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }); p.ToCollection("planets"); });
고유 인덱스
고유 인덱스는 여러 문서가 인덱스된 필드 에 대해 동일한 값을 포함하지 않도록 합니다. 기본값 으로 MongoDB 컬렉션 만드는 동안 _id
필드 에 고유 인덱스 만듭니다. 이 인덱스 수정하거나 제거 할 수 없습니다.
이전 섹션에 표시된 대로 HasIndex()
메서드를 사용하여 인덱스 생성한 다음 IsUnique()
메서드를 연결하여 고유 인덱스 만들 수 있습니다. 다음 예시 Planet
엔터티에 고유 인덱스 생성합니다.
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsUnique(); p.ToCollection("planets"); });
인덱스 옵션
인덱스 생성할 때 옵션을 지정하여 인덱스 이름, 속성 또는 인덱스 유형을 사용자 지정할 수 있습니다. 다음 섹션에서는 지정할 수 있는 몇 가지 옵션에 대해 설명합니다.
명명된 인덱스
기본값 으로 MongoDB 인덱스 의 필드와 옵션을 기반으로 생성된 이름으로 인덱스 만듭니다. 인덱스 에 대한 사용자 지정 이름을 지정하려면 인덱스 생성할 때 이름을 문자열로 전달합니다. 다음 예시 이름이 "named_order"
인 Planet
엔터티에 복합 인덱스 생성합니다.
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => new { p.orderFromSun, p.name }, "named_order"); p.ToCollection("planets"); });
인덱스 순서
기본값 으로 MongoDB 오름차순으로 인덱스를 생성합니다. 새 인덱스 만들 때 IsDescending()
메서드를 호출하여 내림차순으로 인덱스 만들 수 있습니다. 다음 예시 Planet
엔터티에 내림차순 인덱스 생성합니다.
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun).IsDescending(); p.ToCollection("planets"); });
참고
내림차순 단일 필드 인덱스 사용하면 인덱스 성능에 부정적인 영향 수 있습니다. 최상의 성능을 얻으려면 오름차순 인덱스만 사용하세요.
MongoDB- 특정 옵션
메서드를 HasCreateIndexOptions()
CreateIndexOptions
사용하여 인덱스 생성하고 .NET/ C# 드라이버 의 클래스 CreateIndexOptions
인스턴스 를 전달하여 추가 MongoDB 관련 옵션을 지정할 수 있습니다. 클래스가 지원하는 모든 옵션을 전달할 수 있습니다. 지원되는 옵션에 대해 자세히 학습 CreateIndexOptions API 설명서를 참조하세요.
다음 예시 인덱스 생성하고 Sparse
옵션을 지정하여 희소 인덱스 생성합니다.
modelBuilder.Entity<Planet>(p => { p.HasIndex(p => p.orderFromSun) .HasCreateIndexOptions(new CreateIndexOptions() { Sparse = true }); p.ToCollection("planets"); });
추가 정보
MongoDB 의 인덱스에 대한 자세한 내용은 MongoDB Server 매뉴얼의 인덱스 가이드 참조하세요.