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 값이 증가하는 것을 확인할 수 있습니다. 이를 통해 실제 운영 환경에서 사용되지 않는 인덱스를 식별하고 제거하여 쓰기 성능을 최적화할 수 있습니다.