Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 쿼리별 인덱스 사용 횟수 추적하는 방법 ($indexStats 완벽 가이드)

MongoDB 인덱스 사용 통계 조회하기

네, MongoDB의 $indexStats 집계 연산자를 사용하면 쿼리에서 각 인덱스가 사용된 횟수를 손쉽게 추적할 수 있습니다. 이 기능은 데이터베이스 성능 튜닝 시 어떤 인덱스가 실제로 활용되고 있는지, 혹은 불필요한 인덱스가 있는지 파악하는 데 매우 유용합니다.

먼저 MongoDB에서 인덱스를 생성하는 쿼리는 다음과 같습니다.

> db.demo508.createIndex({"FirstName":1});
{
   "createdCollectionAutomatically" : true,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

위 결과를 보면 컬렉션이 자동으로 생성되었으며, 인덱스 수가 1개에서 2개로 늘어난 것을 확인할 수 있습니다.

테스트 데이터 삽입하기

이제 문서(document)를 포함한 컬렉션에 데이터를 삽입해 보겠습니다.

> db.demo508.insertOne({"FirstName":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e883818987b6e0e9d18f578")
}
> db.demo508.insertOne({"FirstName":"Chris"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e88381b987b6e0e9d18f579")
}
> db.demo508.insertOne({"FirstName":"David"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e88381f987b6e0e9d18f57a")
}

저장된 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo508.find();

위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{ "_id" : ObjectId("5e883818987b6e0e9d18f578"), "FirstName" : "John" }
{ "_id" : ObjectId("5e88381b987b6e0e9d18f579"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e88381f987b6e0e9d18f57a"), "FirstName" : "David" }

$indexStats로 인덱스 사용 횟수 확인하기

각 인덱스가 쿼리에서 몇 번 사용되었는지 추적하려면 aggregate() 메서드와 함께 $indexStats를 사용합니다.

> db.demo508.aggregate([{ $indexStats: { } }]).pretty();

실행 결과는 다음과 같습니다.

{
   "name" : "_id_",
   "key" : {
      "_id" : 1
   },
   "host" : "DESKTOP-QN2RB3H:27017",
   "accesses" : {
      "ops" : NumberLong(0),
      "since" : ISODate("2020-04-04T07:32:27.394Z")
   }
}
{
   "name" : "FirstName_1",
   "key" : {
      "FirstName" : 1
   },
   "host" : "DESKTOP-QN2RB3H:27017",
   "accesses" : {
      "ops" : NumberLong(0),
      "since" : ISODate("2020-04-04T07:32:27.527Z")
   }
}

출력 결과 해석하기

결과에서 주목해야 할 핵심 필드는 다음과 같습니다.

name: 인덱스의 이름입니다. 위 예시에서는 기본 인덱스인 _id_와 새로 생성한 FirstName_1 두 개가 조회됩니다.
key: 해당 인덱스가 적용된 필드와 정렬 순서를 나타냅니다.
accesses.ops: 인덱스가 사용된 총 횟수입니다. 현재는 아직 조회 쿼리가 실행되지 않아 0으로 표시됩니다.
accesses.since: 통계 수집이 시작된 시점의 타임스탬프입니다.

참고로, 이후 find() 등의 쿼리에서 FirstName 조건을 사용해 검색하면 ops 값이 증가하는 것을 확인할 수 있습니다. 이를 통해 실제 운영 환경에서 사용되지 않는 인덱스를 식별하고 제거하여 쓰기 성능을 최적화할 수 있습니다.