이 문서는 Google Cloud Translation API를 사용해 자동 번역되었습니다.
어떤 문서는 원문을 읽는게 나을 수도 있습니다.
MongoDB는 확장성, 유연성 및 성능으로 잘 알려진 널리 사용되는 문서 기반 NoSQL 데이터베이스입니다. 동적 스키마와 복잡한 데이터 유형에 대한 지원을 통해 MongoDB는 많은 최신 애플리케이션을 위한 기본 데이터베이스가 되었습니다. 그러나 데이터가 증가하고 쿼리의 복잡성이 증가함에 따라 최적의 성능을 보장하기 위해 쿼리를 최적화하는 것이 필수적입니다. 이 가이드에서는 MongoDB 쿼리를 최적화하기 위한 모범 사례와 팁을 살펴봅니다.
MongoDB 쿼리 최적화를 위한 모범 사례를 살펴보기 전에 먼저 MongoDB가 쿼리를 최적화하는 방법을 이해해 보겠습니다. 쿼리가 실행되면 MongoDB는 쿼리 최적화 프로그램을 사용하여 쿼리를 실행하는 가장 효율적인 방법을 결정합니다. 쿼리 최적화 프로그램은 쿼리를 분석하고 원하는 문서를 얻는 데 필요한 단계를 설명하는 실행 계획을 생성합니다.
실행 계획은 쿼리의 선택성, 인덱스 사용량 및 사용 가능한 리소스와 같은 다양한 요소를 고려하여 가장 효율적인 경로를 결정합니다. 인덱스 사용은 검색 범위를 문서의 하위 집합으로 좁혀 스캔해야 하는 문서 수를 줄이는 데 도움이 되므로 쿼리 최적화에서 매우 중요합니다. MongoDB는 쿼리를 최적화하는 데 사용할 수 있는 다양한 유형의 인덱스를 지원합니다.
이제 쿼리 최적화에 대한 기본적인 이해가 있으므로 MongoDB 쿼리를 최적화하기 위한 몇 가지 모범 사례를 살펴보겠습니다.
MongoDB 쿼리를 최적화하는 가장 효과적인 방법 중 하나는 인덱스를 효율적으로 사용하는 것입니다. 인덱스를 사용하면 MongoDB가 문서를 빠르게 찾고 대규모 컬렉션의 경우 시간이 많이 소요될 수 있는 전체 컬렉션 스캔을 수행하지 않아도 됩니다.
인덱스를 효과적으로 사용하려면 쿼리가 인덱스를 사용하도록 설계되었고 올바른 인덱스가 생성되었는지 확인하십시오. 인덱스를 사용하는 쿼리를 설계하려면 explain()
메서드를 사용하여 실행 계획을 보고 인덱싱이 필요할 수 있는 느린 쿼리를 식별합니다.
쿼리에 적합한 인덱스를 선택하면 성능에 상당한 영향을 미칠 수 있습니다. MongoDB는 각각 특정 쿼리 패턴에 적합한 여러 유형의 인덱스를 지원합니다. 가장 일반적으로 사용되는 인덱스는 다음과 같습니다.
단일 필드 인덱스: 이 유형의 인덱스는 단일 필드를 기반으로 문서를 필터링하는 쿼리에 적합합니다. 단일 필드 인덱스를 생성하려면 createIndex()
명령을 사용하십시오.
db.users.createIndex({이름: 1})
복합 인덱스: 이 유형의 인덱스는 여러 필드를 기반으로 문서를 필터링하는 쿼리에 적합합니다. 복합 인덱스를 만들려면 인덱스에서 필드와 해당 순서를 지정합니다.
db.users.createIndex({이름: 1, 연령: -1})
텍스트 인덱스: 이 유형의 인덱스는 전체 텍스트 검색을 수행하는 쿼리에 적합합니다. 텍스트 인덱스를 만들려면 필드와 해당 언어를 지정합니다.
db.articles.createIndex({콘텐츠: '텍스트'})
지리 공간 인덱스: 이 유형의 인덱스는 지리 공간 쿼리를 수행하는 쿼리에 적합합니다. 지리 공간 인덱스를 만들려면 필드와 해당 유형을 지정합니다.
db.locations.createIndex({위치: '2dsphere'})
해시 인덱스: 이 유형의 인덱스는 동등 일치를 수행하는 쿼리에 적합합니다. 해시 인덱스를 생성하려면 필드를 지정합니다.
db.users.createIndex({이메일: '해시됨'})
올바른 인덱스를 선택하는 것 외에도 쿼리를 최적화하기 위해 필드를 인덱싱하는 방법을 고려해야 합니다. 고려해야 할 일부 인덱싱 전략은 다음과 같습니다.
커버링 인덱스: 이 인덱스에는 쿼리를 충족하는 데 필요한 모든 필드가 포함되어 있어 스캔해야 하는 문서의 수가 줄어듭니다.
정렬 및 범위 인덱스: 이 인덱스는 정렬 및 범위 쿼리를 수행하는 쿼리에 유용하여 스캔해야 하는 데이터의 양을 줄입니다.
배열이 있는 인덱스: 이 인덱스는 배열을 기반으로 문서를 필터링하는 쿼리에 유용하여 스캔해야 하는 문서 수를 줄입니다.
MongoDB 집계 파이프라인은 데이터 레코드를 처리하고 계산된 결과를 반환하는 강력한 도구입니다. 집계 파이프라인은 개발자가 유연한 방식으로 데이터를 필터링, 그룹화, 변환 및 집계할 수 있는 데이터 집계를 위한 프레임워크입니다.
집계 파이프라인을 사용하면 실행되는 쿼리 수를 줄이고 쿼리 성능을 향상시킬 수 있습니다. 집계 파이프라인은 각 단계가 입력 데이터에 대해 특정 작업을 수행하는 단계 배열로 표시됩니다.
다음 예에서는 $group
단계를 사용하여 status
필드별로 문서를 그룹화하고 각 그룹의 평균 amount
를 계산합니다.
db.orders.aggregate([
{ $group: { _id: "$status", avgAmount: { $avg: "$amount" } } }
])
다음 예제에서는 $match
단계를 사용하여 데이터를 처리하기 전에 특정 조건을 기반으로 문서를 필터링합니다.
db.orders.aggregate([
{ $match: { status: "pending" } },
{ $group: { _id: "$customer", total: { $sum: "$amount" } } }
])
다음 예제에서는 $project
단계를 사용하여 입력 데이터를 변환하고 새 필드 totalAmount
를 계산합니다.
db.orders.aggregate([
{ $project: { _id: 0, customer: 1, totalAmount: { $add: [ "$amount", "$tax" ] } } }
])
큰 결과 집합을 반환하면 쿼리 성능에 상당한 영향을 미치고 네트워크 트래픽이 증가할 수 있습니다. 쿼리를 최적화하려면 큰 결과 집합을 반환하지 마십시오.
큰 결과 집합을 피하는 한 가지 방법은 더 작은 청크로 데이터를 검색할 수 있는 페이지 매김을 사용하는 것입니다. 페이지 매김을 구현하려면 'skip()' 및 'limit()' 메서드를 사용하여 건너뛸 문서 수와 반환할 문서 수를 지정하세요.
db.orders.find().skip(10).limit(5)
쿼리 힌트는 개발자가 쿼리 실행 방법에 대한 특정 지침을 쿼리 최적화 프로그램에 제공할 수 있는 강력한 도구입니다. 쿼리 힌트는 쿼리 최적화 프로그램의 결정을 재정의하고 특정 인덱스 또는 실행 계획을 사용하는 데 사용할 수 있습니다.
쿼리 힌트를 사용하려면 hint()
메서드를 사용하고 사용할 인덱스를 지정합니다.
db.orders.find({ status: "pending" }).hint({ status: 1 })
MongoDB 쿼리를 최적화하려면 쿼리 성능을 테스트하여 최적화가 필요한 느린 쿼리를 식별하는 것이 필수적입니다. MongoDB는 explain()
메서드 및 MongoDB 프로파일러를 포함하여 쿼리 성능을 테스트하기 위한 여러 도구를 제공합니다.
explain()
메서드는 쿼리가 실행되는 방법에 대한 정보를 반환하고 쿼리 최적화 프로그램의 결정에 대한 통찰력을 제공합니다. explain()
메서드는 느린 쿼리를 식별하고 성능을 최적화하는 데 사용할 수 있습니다.
db.orders.find({ status: "pending" }).explain()
MongoDB 프로파일러는 쿼리 성능 메트릭을 포함하여 데이터베이스 작업에 대한 데이터를 캡처하는 도구입니다. MongoDB 프로파일러를 사용하여 느린 쿼리를 식별하고 성능을 최적화할 수 있습니다.
MongoDB 쿼리 최적화는 최신 애플리케이션의 최적 성능과 확장성을 보장하는 데 중요합니다. 인덱스를 효과적으로 사용하고, Aggregation Pipeline을 사용하고, 큰 결과 세트를 피하고, 쿼리 힌트를 사용하고, 쿼리 성능을 테스트함으로써 개발자는 MongoDB 쿼리를 최적화하고 애플리케이션의 성능을 향상시킬 수 있습니다.