programing

MongoDB 찾기 성능: 단일 복합 인덱스 VS 두 개의 단일 필드 인덱스

newstyles 2023. 4. 29. 08:54

MongoDB 찾기 성능: 단일 복합 인덱스 VS 두 개의 단일 필드 인덱스

MongoDb 3.4에서 어떤 인덱싱 전략을 사용할지 조언을 구하고 있습니다.

다음과 같은 모양의 사용자 문서 모음이 있다고 가정합니다.

{
    _id: 10,
    name: "Bob",
    age: 32,
    profession: "Hacker"
}

컬렉션을 쿼리하는 웹 API가 노출되어 있으며 사용 가능한 필터는 이름 또는 연령별뿐이라고 가정해 보겠습니다.
에 대한 api 에 한 샘 플 은 출 같 니 다 습 과 다 음 대 호 ▁will 다 니 ▁a ▁apihttp://myAwesomeWebSite/people?name="Bob"&age=25

는 다음됩니다.db.people.find({name: "Bob", age: 25}).

시나리오를 보다 명확하게 하기 위해 다음 사항을 고려합니다.

  • 필드 이름이 이미 문서에 있으며 해당 필드에 대한 인덱스가 이미 있습니다.
  • 애플리케이션의 새로운 기능으로 인해 새로운 필드 시대를 추가할 예정입니다.
  • 데이터베이스는 위에서 언급한 웹 API를 통해서만 접근할 수 있으며 가장 중요한 요구 사항은 초고속 웹 API를 노출하는 것입니다.
  • 웹 api에 대한 모든 호출은 필드 이름과 나이 모두에 필터를 적용합니다(다른 말로 하면, 웹 api에 대한 모든 호출은 위에 표시된 것과 같은 패턴을 가질 것입니다).

즉, 다음 중 어떤 인덱스가 최상의 성능을 제공하는지 결정해야 합니다.

  • 지수: 하의복합지수나:{name: 1, age: 1}
  • 개의 인덱스: 두개단필인덱스:{name: 1}그리고.{age: 1}

몇 가지 간단한 테스트에 따르면 단일 복합 지수가 두 개의 단일 필드 지수보다 훨씬성능이 좋은 것으로 보입니다.

mongo 셸을 통해 단일 쿼리를 실행함으로써, explain() 메서드는 단일 복합 인덱스를 사용하면 두 개의 단일 필드 인덱스를 사용하는 것보다 거의 10배 더 빠르게 데이터베이스를 쿼리할 수 있음을 제안합니다.

몽고 셸을 통해 단일 쿼리를 실행하는 대신 nodejs응용 프로그램의 두 개의 서로 다른 URL에 여러호출하는 보다 현실적인 시나리오에서는 이러한 차이가 덜 극적인 것으로 보입니다.두 URL 모두 데이터베이스에 대한 쿼리를 실행하고 가져온 데이터를 json 배열로 반환합니다. 하나는 단일 복합 인덱스가 있는 컬렉션을 사용하고 다른 하나는 두 개의 단일 필드 인덱스가 있는 컬렉션을 사용합니다(둘 다 문서가 정확히 동일함).
이 검정에서는 단일 복합 지수가 여전히 성능 면에서 가장 좋은 선택인 것처럼 보이지만, 이번에는 그 차이가 덜 표시됩니다.

테스트 결과에 따라 단일 복합 지수 방식을 사용하는 것을 고려하고 있습니다.

이 주제에 대해 경험이 있는 사람이 있습니까?중요한 고려 사항이 누락되었습니까(큰 복합 지수의 단점일 수도 있습니다)?

됩니다(" " " " " " " " " " " " " " ( " " " " " " ).limit()또는sort()또는 두 개의 필드(예: 에서)에 필터 조건이 있는 화려한 것.name그리고.ageMongoDB는 결과 문서를 찾기 위해 다음 중 하나를 수행합니다.

  1. 전체 컬렉션 검색을 수행합니다(전체 컬렉션의 모든 문서 읽기, BSON 구문 분석, 문제의 값 찾기, 입력에 대해 테스트 및 각 문서 반환/폐기).이는 매우 많은 I/O를 필요로 하기 때문에 속도가 느립니다.
  2. 필드 중 하나를 포함하는 인덱스를 사용합니다(인덱스 트리를 사용하여 관련 문서의 하위 집합을 찾은 후 검색).데이터 배포/색인 선택성에 따라 매우 빠르거나 거의 이점을 제공하지 못할 수 있습니다(색인의 경우age30년에서 40년 사이의 수백만 명의 사람들의 데이터 세트에서 --> 모든 조회는 여전히 무한한 수의 문서를 산출할 것입니다.)
  3. 문제의 두 필드를 모두 포함하는 두 의 인덱스를 함께 사용합니다(두 인덱스 로드, 키 조회 수행, 결과의 교차점 계산).데이터 분포에 따라 성능이 향상되거나 저하될 수 있습니다.그러나 대부분의 경우 #2보다 빨라야 합니다.하지만 당신이 언급한 것처럼 4위보다 정말 10배 느리다면 저는 놀랄 것입니다.
  4. 복합 인덱스를 사용합니다(이후 두 번의 키 검색을 수행하면 필요한 문서가 즉시 표시됨).정확한 문서를 얻기 위해 최소한의 비용으로 작업해야 한다는 점을 감안할 때 이 방법이 가장 빠른 옵션이 될 것입니다.최대 수준의 재사용(이에 영향을 받지 않는 성능이 아님)을 보장하려면 일반적으로 가장 선택적인 필드부터 시작해야 합니다. 따라서 귀하의 경우 아마도name그리고 아닌age많은 사람들이 같은 것을 가질 것을 고려할 때.age 낮음)과하여 (선택성이 낮음) 비name(선택 가능성 선택).그러나 이러한 선택은 구체적인 시나리오와 데이터베이스에 대해 실행하려는 쿼리에 따라 달라집니다.웹에는 특정 상황의 다양한 측면을 고려하여 복합 지수를 가장 잘 정의하는 방법에 대한 꽤 좋은 기사가 있습니다. https://emptysqua.re/blog/optimizing-mongodb-compound-indexes

고려해야 할 다른 측면은 다음과 같습니다.인덱스 업데이트는 특정 가격에 제공됩니다.그러나 원시 읽기 속도에만 관심이 있고 가끔 업데이트가 몇 개만 있는 경우에는 더 많은/더 큰 인덱스를 선택해야 합니다.

마지막으로 (!) 지나치게 많이 사용되는 핵심 조언은 실제 데이터와 실제 로드 시나리오를 사용하여 시스템을 프로파일링하는 것입니다.또한 시간이 지남에 따라 데이터/시스템이 변화함에 따라 계속 측정할 수 있습니다.

추가 읽기: https://docs.mongodb.com/manual/core/query-optimization/index.html

https://dba.stackexchange.com/questions/158240/mongodb-index-intersection-does-not-eliminate-the-need-for-creating-compound-in

지수 교차점 대 복합 지수?

mongodb 복합 지수 대 인덱스 교차

MongoDB에서 복합 인덱스의 순서는 성능 측면에서 어떻게 중요합니까?

MongoDB에서는 복합 인덱스 또는 단일 인덱스를 만드는 방법에 대한 큰 쿼리를 사용하고 있습니다. 따라서 내 응답 시간이 증가합니다.

언급URL : https://stackoverflow.com/questions/47893613/mongodb-find-performance-single-compound-index-vs-two-single-field-indexes