Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

색인 관리

이 페이지의 내용

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

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

다음 섹션에서는 컬렉션이나 전체 데이터베이스의 기존 인덱스를 보는 방법을 제공합니다.

MongoDB Compass에서 컬렉션의 모든 인덱스 목록을 보려면 왼쪽 창에서 대상 컬렉션을 클릭하고 Indexes 탭을 선택합니다.

Compass에서 컬렉션의 인덱스 보기

이 탭에 표시되는 정보에 대한 자세한 내용은 Compass 문서를 참조하세요.

컬렉션 의 모든 인덱스 목록을 반환하려면 db.collection.getIndexes() 메서드 또는 운전자 에 맞는 유사한 메서드를 사용합니다.

예를 들어 people 컬렉션의 모든 인덱스를 보려면 다음 명령을 실행합니다:

db.people.getIndexes()

데이터베이스의 모든 컬렉션 인덱스를 나열하려면 mongosh에서 다음 작업을 사용할 수 있습니다.

db.getCollectionNames().forEach(function(collection) {
indexes = db[collection].getIndexes();
print("Indexes for " + collection + ":");
printjson(indexes);
});

버전 3.0 부터 MongoDB는 이전에 데이터베이스의 모든 인덱스를 나열하는 데 사용되었던 system.indexes 컬렉션에 대한 직접 액세스를 더 이상 사용하지 않습니다.

특정 유형의 모든 인덱스를 나열하려면(예: 모든 데이터베이스의 모든 컬렉션 에 대해 mongosh 에서 다음 작업을 사용할 수 있습니다 .

// The following finds all hashed indexes
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(idx){
let idxValues = Object.values(Object.assign({}, idx.key));
if (idxValues.includes("hashed")) {
print("Hashed index: " + idx.name + " on " + d.name + "." + c.name);
printjson(idx);
};
});
});
});

인덱스 숨긴 후 제거하기

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

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

MongoDB Shell에서 인덱스를 제거할 때 다음 중 하나를 수행할 수 있습니다.

  • 특정 인덱스를 제거합니다.

  • 컬렉션에서 모든 인덱스를 제거합니다.

인덱스를 제거하려면 db.collection.dropIndex() 메서드를 사용합니다.

예를 들어, 다음 작업은 accounts 컬렉션의 tax-id 필드에서 오름차순 인덱스를 제거합니다.

db.accounts.dropIndex( { "tax-id": 1 } )

이 작업은 작업 상태가 포함된 문서를 반환합니다.

{ "nIndexesWas" : 3, "ok" : 1 }

여기서 nIndexesWas 값은 이 인덱스를 제거 하기 전의 인덱스 수를 반영합니다.

텍스트 인덱스의 경우 인덱스 이름을 db.collection.dropIndex() 메서드에 전달합니다. 자세한 내용 은 인덱스 이름을 사용하여 text 인덱스 삭제 를 참조하세요.

참고

db.collection.dropIndexes() 인덱스 이름 배열을 받을 수 있습니다.

db.collection.dropIndexes() 는 진행 중인 인덱스 빌드를 중지할 수 있습니다. 자세한 내용은 진행 중인 인덱스 빌드 중단 을 참조하세요.

를 사용하여 컬렉션에서 _id 인덱스 db.collection.dropIndexes() 를 제외한 모든 인덱스를 제거할 수도 있습니다.

예를 들어, 다음 명령은 accounts 컬렉션에서 모든 인덱스를 제거합니다.

db.accounts.dropIndexes()

이러한 shell 헬퍼는 dropIndexes 데이터베이스 명령 을 감싸는 래퍼를 제공합니다. 클라이언트 라이브러리 에는 이러한 작업을 위한 다른 인터페이스 또는 추가 인터페이스가 있을 수 있습니다.

MongoDB Compass 의 컬렉션 에서 인덱스 를 제거 하려면 다음을 수행합니다.

  1. 대상 인덱스 가 포함된 컬렉션 으로 이동합니다.

  2. Indexes 탭을 클릭합니다.

  3. 대상 인덱스의 Drop 열에서 휴지통 아이콘을 클릭합니다.

Compass 에서 인덱스 삭제

MongoDB Shell에서 기존 인덱스를 수정하려면 인덱스를 제거하고 다시 생성해야 합니다. 이 규칙의 예외는 TTL 인덱스로, index 컬렉션 플래그와 함께 collMod 명령을 사용하여 수정할 수 있습니다

MongoDB Compass에서 기존 인덱스를 수정하려면 인덱스를 제거하고 다시 생성해야 합니다.

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

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

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 서버 프라이머리에서 샤드 컬렉션의 샤드에서 일관적이지 않은 인덱스를 확인하며, serverStatus 명령이 config 서버 프라이머리에서 실행되는 경우 일관성 없는 인덱스가 존재하는 샤드 컬렉션의 수를 보고하는 shardedIndexConsistency 필드를 반환합니다.

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 명령을 실행하여 시간(초)을 업데이트할 수 있습니다.

돌아가기

교차로