문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

색인 관리

이 페이지의 내용

  • 기존 인덱스 보기
  • 인덱스 제거
  • 인덱스 수정
  • 전체 샤드에서 일관성 없는 인덱스 찾기

이 페이지에서는 기존 인덱스를 관리하는 방법을 설명합니다. 인덱스 생성에 대한 내용은 특정 인덱스 유형 페이지에서 확인 가능합니다.

인덱스 숨긴 후 삭제하기

프로덕션에서 활발하게 사용하는 인덱스를 삭제하면 애플리케이션 성능이 저하될 수 있습니다. 인덱스를 삭제하기 전에 숨겨서 삭제의 잠재적 영향을 평가할 수 있습니다.

숨겨진 인덱스는 쿼리 지원에 사용되지 않습니다. 인덱스를 숨겼는데 성능에 상당히 부정적인 영향을 미치는 경우, 쿼리에서 사용하도록 인덱스를 유지했다가 숨기기를 해제하는 것이 좋습니다.

프로덕션에서 활발하게 사용되는 인덱스를 삭제하면 애플리케이션 성능이 저하될 수 있습니다. 수정하는 동안 쿼리에서 인덱스를 계속 사용할 수 있도록 수정된 인덱스와 동일한 필드를 포함하는 임시 중복 인덱스를 생성할 수 있습니다.

이 예시에서는 새 인덱스를 생성하여 고유한 인덱스로 수정합니다.

1

다음 명령을 실행합니다.

db.siteAnalytics.createIndex( { "url": 1 } )

이 명령은 인덱스 이름을 반환합니다.

url_1
2

다음 명령을 실행합니다.

db.siteAnalytics.createIndex( { "url": 1, "dummyField": 1 } )

이 명령은 인덱스 이름을 반환합니다.

url_1_dummyField_1

임시 인덱스를 사용하면 성능에 영향을 주지 않고 원래 { "url": 1 } 인덱스를 안전하게 삭제할 수 있습니다.

3

다음 명령을 실행합니다.

db.siteAnalytics.dropIndex( { "url": 1 } )

이 명령은 아래를 반환합니다.

{ nIndexesWas: 3, ok: 1 }
4

다음 명령을 실행합니다.

db.siteAnalytics.createIndex( { "url": 1 }, { "unique": true } )

이 명령은 인덱스 이름을 반환합니다.

url_1

url_1 인덱스가 다시 생성되며 성능에 영향을 주지 않고 임시 인덱스를 삭제할 수 있습니다. url 필드에 대한 쿼리는 새로운 고유 인덱스를 사용할 수 있습니다.

5

다음 명령을 실행합니다.

db.siteAnalytics.dropIndex( { "url": 1, "dummyField": 1 } )

이 명령은 아래를 반환합니다.

{ nIndexesWas: 3, ok: 1 }
6

siteAnalytics 컬렉션의 인덱스를 확인하려면 이 명령을 실행합니다

db.siteAnalytics.getIndexes()

이 명령은 이러한 인덱스를 반환하여 url_1 인덱스가 이제 고유한 인덱스라는 사실을 나타냅니다.

[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { url: 1 }, name: 'url_1', unique: true }
]

컬렉션의 각 샤드에 컬랙션 청크를 포함하는 완전히 동일한 인덱스(인덱스 옵션 포함)가 없을 경우 샤드된 컬렉션에 일관성 없는 인덱스가 포함됩니다. 정상 작업 중에는 이러한 상황이 없어야 하지만 아래와 같은 경우에 일관성 없는 인덱스가 발생할 수 있습니다.

  • 예를 들어 사용자가 unique 키 제약 조건을 사용하여 인덱스를 생성 중이고 하나의 샤드에 중복 문서가 있는 청크가 포함되어 있는 경우와 같이 일관성 없는 인덱스가 발생할 수 있습니다. 이러한 경우 인덱스 생성 작업은 중복이 없는 샤드에서는 성공할 수 있지만 중복이 있는 샤드에서는 실패할 수 있습니다.

  • 사용자가 샤드 전체에 걸쳐 인덱스를 롤링 방식(즉, 샤드 전체에 걸쳐 하나씩 수동으로 인덱스를 생성)으로 생성하는 경우, 연결된 샤드에 대한 인덱스를 생성하지 못하거나 다른 사양으로 인덱스를 잘못 생성하는 경우입니다.

config 서버 프라이머리는 기본적으로 샤드된 collection에 대한 인덱스 불일치를 확인하고, serverStatus 명령을 config 서버 프라이머리에서 실행하면 shardedIndexConsistency 필드를 반환하여 샤드된 collection의 수에 대해 보고합니다. 인덱스 불일치.

shardedIndexConsistency에서 인덱스 불일치를 보고하면 불일치를 찾을 때까지 샤딩된 컬렉션에 다음 파이프라인을 실행할 수 있습니다.

  1. 다음 집계 파이프라인을 정의합니다.

    const pipeline = [
    // Get indexes and the shards that they belong to.
    {$indexStats: {}},
    // Attach a list of all shards which reported indexes to each document from $indexStats.
    {$group: {_id: null, indexDoc: {$push: "$$ROOT"}, allShards: {$addToSet: "$shard"}}},
    // Unwind the generated array back into an array of index documents.
    {$unwind: "$indexDoc"},
    // Group by index name.
    {
    $group: {
    "_id": "$indexDoc.name",
    "shards": {$push: "$indexDoc.shard"},
    // Convert each index specification into an array of its properties
    // that can be compared using set operators.
    "specs": {$push: {$objectToArray: {$ifNull: ["$indexDoc.spec", {}]}}},
    "allShards": {$first: "$allShards"}
    }
    },
    // Compute which indexes are not present on all targeted shards and
    // which index specification properties aren't the same across all shards.
    {
    $project: {
    missingFromShards: {$setDifference: ["$allShards", "$shards"]},
    inconsistentProperties: {
    $setDifference: [
    {$reduce: {
    input: "$specs",
    initialValue: {$arrayElemAt: ["$specs", 0]},
    in: {$setUnion: ["$$value", "$$this"]}}},
    {$reduce: {
    input: "$specs",
    initialValue: {$arrayElemAt: ["$specs", 0]},
    in: {$setIntersection: ["$$value", "$$this"]}}}
    ]
    }
    }
    },
    // Only return output that indicates an index was inconsistent, i.e. either a shard was missing
    // an index or a property on at least one shard was not the same on all others.
    {
    $match: {
    $expr:
    {$or: [
    {$gt: [{$size: "$missingFromShards"}, 0]},
    {$gt: [{$size: "$inconsistentProperties"}, 0]},
    ]
    }
    }
    },
    // Output relevant fields.
    {$project: {_id: 0, indexName: "$$ROOT._id", inconsistentProperties: 1, missingFromShards: 1}}
    ];
  2. 테스트할 샤딩 컬렉션에 대한 집계 파이프라인을 실행합니다. 예를 들어 test.reviews 샤딩 컬렉션이 관련 샤드 전반에 일관적이지 않은 인덱스를 보유한 경우 테스트를 위해 아래를 실행합니다.

    db.getSiblingDB("test").reviews.aggregate(pipeline)

    컬렉션에 일관성 없는 인덱스가 포함된 경우 해당 컬렉션의 집계는 이러한 인덱스의 상세 정보를 반환합니다.

    { "missingFromShards" : [ "shardB" ], "inconsistentProperties" : [ ], "indexName" : "page_1_score_1" }
    { "missingFromShards" : [ ], "inconsistentProperties" : [ { "k" : "expireAfterSeconds", "v" : 60 }, { "k" : "expireAfterSeconds", "v" : 600 } ], "indexName" : "reviewDt_1" }

    반환된 문서에 샤드된 collection test.reviews에 대한 두 가지 불일치가 있습니다:

    1. shardB의 컬렉션에서 page_1_score_1 이라는 인덱스가 누락되었습니다.

    2. reviewDt_1 이라는 인덱스에는 컬렉션의 샤드 전체에 일관적이지 않은 속성이 포함되며, 특히 expireAfterSeconds 속성이 다릅니다.

특정 샤드의 컬렉션에서 인덱스가 누락된 불일치를 해결하려면,

둘 중 하나를 수행하면 됩니다.

  • 영향을 받는 샤드에서 컬렉션에 대해 롤링 인덱스 빌드를 수행합니다.

    -또는-

  • mongos 인덱스에서 db.collection.createIndex() 인스턴스 빌드를 실행합니다. 이 작업은 인덱스가 누락된 샤드에 대해 컬렉션의 인덱스를 작성합니다.

샤드 전반에서 인덱스 속성이 다른 상황을 해결하려면,

컬렉션에서 해당 샤드에 관한 정확하지 않은 인덱스를 삭제하고 인덱스를 다시 작성합니다. 다음 두 가지 중 한 가지 방법으로 인덱스를 다시 작성할 수 있습니다.

또는 불일치가 expireAfterSeconds 속성인 경우 인덱스를 삭제하고 다시 작성하는 대신 collMod 명령을 실행하여 시간(초)을 업데이트할 수 있습니다.

← 인덱스 교차