복붙노트

[MONGODB] 어떻게 화합물 인덱스의 순서는 MongoDB의 성능 현명한에 문제가 있습니까?

MONGODB

어떻게 화합물 인덱스의 순서는 MongoDB의 성능 현명한에 문제가 있습니까?

우리는 매개 변수가 조회되는 것과 같은 순서로 복합 인덱스를 작성해야합니다. 이 순서는 성능 현명한 전혀 중요합니까?

우리는 섹스에 대한 인덱스 (시간의 99.9 % "남성"또는 "여성"하지만 문자열 nontheless (이진되지 않음))와 이름에 대한 인덱스와 지구상의 모든 인간의 컬렉션을 상상해보십시오.

우리는 예를 들어, 특정 이름을 가진 특정 성별의 모든 사람을 선택 할 수 있도록하려는 것입니다 경우 "요"라는 s의 모든 "남성"더 나은 첫 섹스와 복합 인덱스가하거나 이름입니까? 왜 (안)?

해결법

  1. ==============================

    1.Redsandro,

    Redsandro,

    당신은 인덱스 카디널리티, 선택을 고려해야합니다.

    인덱스 카디널리티는 필드에 얼마나 많은 수있는 값을 의미한다. 필드 섹스는 두 가지 값이 있습니다. 그것은 매우 낮은 카디널리티가 있습니다. 등 이름, 사용자 이름, 전화 번호, 이메일, 같은 다른 분야는 높은 카디 간주됩니다 수집, 모든 문서에 대한 더 고유 한 값을가집니다.

    또한, 선택적으로 인덱스와 인덱스 필드 가능한 문서의 수를 제한 쓰기 쿼리를 사용하고 싶습니다. 간단하게하려면 다음 수집을 고려하십시오. , 쿼리를 실행할 경우 : 인덱스가 {1 이름} 인 경우 {이름 : "존", 성별 : "남성"}. 당신은 1 문서를 스캔해야합니다. 당신이 사용할 수 있기 때문에 MongoDB를 선택적 수 있습니다.

    {_id:ObjectId(),name:"John",sex:"male"}
    {_id:ObjectId(),name:"Rich",sex:"male"}
    {_id:ObjectId(),name:"Mose",sex:"male"}
    {_id:ObjectId(),name:"Sami",sex:"male"}
    {_id:ObjectId(),name:"Cari",sex:"female"}
    {_id:ObjectId(),name:"Mary",sex:"female"}
    

    다음 수집을 고려하십시오. 색인은 {섹스 : 1} 인 경우, 쿼리를 실행하면 {성별 : "남성"이름 : "존"}. 당신은 4 문서를 스캔해야합니다.

    {_id:ObjectId(),name:"John",sex:"male"}
    {_id:ObjectId(),name:"Rich",sex:"male"}
    {_id:ObjectId(),name:"Mose",sex:"male"}
    {_id:ObjectId(),name:"Sami",sex:"male"}
    {_id:ObjectId(),name:"Cari",sex:"female"}
    {_id:ObjectId(),name:"Mary",sex:"female"}
    

    더 큰 데이터 세트에 가능한 차이를 상상해보십시오.

    이 복합 인덱스에 대한 잘못된 가정을 쉽게 만들 수 있습니다. 화합물 인덱스의 MongoDB의 워드 프로세서 장치.

    당신은 복합 인덱스를 만들 때, 1 지수는 여러 필드를 개최한다. 우리 지수에 의해 수집한다면 { "섹스": 1, "이름": 1}, 인덱스처럼 거의 보일 것이다 :

    ["male","Rick"] -> 0x0c965148
    ["male","John"] -> 0x0c965149
    ["male","Sean"] -> 0x0cdf7859
    ["male","Bro"] ->> 0x0cdf7859
    ...
    ["female","Kate"] -> 0x0c965134
    ["female","Katy"] -> 0x0c965126
    ["female","Naji"] -> 0x0c965183
    ["female","Joan"] -> 0x0c965191
    ["female","Sara"] -> 0x0c965103
    

    우리가 인덱스에 의해 수집하는 경우 { "이름": 1, "섹스": 1}, 인덱스는 약처럼 보일 것이다 :

    ["John","male"] -> 0x0c965148
    ["John","female"] -> 0x0c965149
    ["John","male"] -> 0x0cdf7859
    ["Rick","male"] -> 0x0cdf7859
    ...
    ["Kate","female"] -> 0x0c965134
    ["Katy","female"] -> 0x0c965126
    ["Naji","female"] -> 0x0c965183
    ["Joan","female"] -> 0x0c965191
    ["Sara","female"] -> 0x0c965103
    

    {이름 : 1}를 갖는 접두어로하는 복합 인덱스를 사용하여 훨씬 더 나은 서비스를 제공합니다. 더 많은 주제에 읽을 수있다, 나는 이것이 약간의 선명도를 제공 할 수 있기를 바랍니다.

  2. ==============================

    2.나는이에 자신을 실험을했고, 처음으로 제대로 구별 인덱스 키를 사용하는 성능 저하 없을 것 같다 발견 말할거야. (I mmap에 상이 할 수도있는 wiredtiger와 MongoDB를 사용하고 3.4). 나는 항목이라는 새 컬렉션에 2 억 5 천만 문서를 삽입. 각각의 문서는 다음과 같이 보았다 :

    나는이에 자신을 실험을했고, 처음으로 제대로 구별 인덱스 키를 사용하는 성능 저하 없을 것 같다 발견 말할거야. (I mmap에 상이 할 수도있는 wiredtiger와 MongoDB를 사용하고 3.4). 나는 항목이라는 새 컬렉션에 2 억 5 천만 문서를 삽입. 각각의 문서는 다음과 같이 보았다 :

    {
        field1:"bob",
        field2:i + "",
        field3:i + ""
    

    "필드 1"언제나 "밥"을 동일. 완전히 독특 있도록 "FIELD2는"내가 동일했다. 우선은 FIELD2에서 검색을했고, 그것은 250,000,000 문서를 스캔하는 분을 인수했다. 그럼 난과 같이 인덱스를 생성 :

    `db.items.createIndex({field1:1,field2:1})`
    

    인덱스가 원하는 문서를 발견하기 전에 항목의 수를 검색해야한다, 그래서 "밥"이 모든 하나의 문서에 필드 1 물론. 그러나, 이것은 내가 가진 결과가 아니었다.

    인덱스 작성을 완료 한 후 나는 컬렉션 다른 검색을했다. 이번에는 내가 아래에 나열된 결과를 얻었다. 당신은 "totalKeysExamined는"때마다 1 볼 수 있습니다. 그래서 아마도 유선 호랑이 또는 뭔가 그들은이 더 나은 작업을 수행하는 방법을 알아 낸. 그게 함께 할 수있는 뭔가가있을 수 있습니다, 그래서 나는, 실제로는 인덱스 접두사를 압축 wiredtiger을 읽었습니다.

    db.items.find ({필드 1은 "밥", FIELD2 : "250888000은"}). ( "executionStats")를 설명

    {
        "executionSuccess" : true,
        "nReturned" : 1,
        "executionTimeMillis" : 4,
        "totalKeysExamined" : 1,
        "totalDocsExamined" : 1,
        "executionStages" : {
            "stage" : "FETCH",
            "nReturned" : 1,
            "executionTimeMillisEstimate" : 0,
            "works" : 2,
            "advanced" : 1,
            ...
            "docsExamined" : 1,
            "inputStage" : {
                "stage" : "IXSCAN",
                "nReturned" : 1,
                "executionTimeMillisEstimate" : 0,
                ...
                "indexName" : "field1_1_field2_1",
                "isMultiKey" : false,
                ...
                "indexBounds" : {
                    "field1" : [
                        "[\"bob\", \"bob\"]"
                    ],
                    "field2" : [
                        "[\"250888000\", \"250888000\"]"
                    ]
                },
                "keysExamined" : 1,
                "seeks" : 1
            }
        }
    

    그럼 (필드 2와 같은 값을 갖는다) FIELD3에 인덱스를 생성. 그럼 내가 검색 :

    db.items.find ({FIELD3 : "250888000"});

    이 복합 인덱스를 가지는 것과 같은 4ms의했다. 나는 FIELD2 및 FIELD3이 서로 다른 값으로 여러 번 반복 사소한 차이가 각 시간을 얻었다. 이 wiredtiger와, 인덱스의 첫 번째 필드에 가난한 차별화를 가진에 대한 성능 저하가 없음을 의미한다.

  3. from https://stackoverflow.com/questions/33545339/how-does-the-order-of-compound-indexes-matter-in-mongodb-performance-wise by cc-by-sa and MIT license