mongodb에서 인덱스 안 걸린 실행 쿼리 찾기( currentOp, explain 사용 )

2023. 3. 28. 21:28mongodb

반응형

0. mongodb에서 인덱스의 중요성

몽고디비는 인덱스가 타 데이터베이스 대비 매우 중요하다고 생각한다. 막말로 인덱스가 없거나, 엉뚱한게 적용되어 있으면, 몽고디비는 조회 자체가 되지 않는다. 심지어 부하가 심한 쿼리의 경우, 디비의 전체적인 성능 저하를 만들어 낸다.

또한 대부분 mongodb가 적용된 프로젝트 중, 실패한 프로젝트의 공통점은 mongodb의 인덱스를 잘 적용하지 못해 실패한 경우가 많다. 따라서 몽고디비는 인덱스를 매우 신경써서 관리해야 하며, 지속적으로 mql ( 몽고디비 쿼리 )를 모니터링 해주어야 한다.

그래서 오늘은 운영 중에서 사용할 수 있는 mongodb에서 인덱스가 걸리지 않는 mql를 찾는 방법에 대해 알아보겠다.

1. 사용 방법

인덱스가 안걸린 mql를 찾는 방법은 db.currentOp() 과 explain() 명령어를 동시에 활용하는 방법이다.


db.currentOp()은 현재 MongoDB 에서 실행 중인 작업 정보를 보여준다. 이를 통해, 실행되는 작업의 상태를 모니터링해, 과도한 리소스를 사용하는 작업을 찾아낼 수 있다. 이러한 특징 때문에 MongoDB의 모니터링과 튜닝에 반드시 필요한 명령어 중 하나이다.

728x90


explain()은 MongoDB에서 쿼리 실행 계획을 분석해 정보를 보여준다. 이를 통해, 실행 계획을 이해할 수 있어, 인덱스를 최적화하고 쿼리의 실행 속도를 향상시키는 데 활용할 수 있다. 이를 통해 인덱스를 추가할지, hint() 명령어 사용할지 여부를 결정할 수 있다.

db.currentOp(), explain() 두개의 명령어를 모르는 사람은 사람은 없을 것이다. 하지만, 이 두개의 명령어를 섞어서 동시에 사용할 수 있다는 걸 아는 사람은 많지 않을 것이다. 그래서 오늘 mongodb 개발자이자, nosql 모델러이자, DBA기도 한...내가 작은 노하우를 공개할까한다.

2. 활용

방법은 currentOp() 안에 function()를 만들어, 그 안에 explain() 를 동시에 사용하는 것이다.

나 같은 경우, mongodb cpu 부하 알람이 오면 바로 해당 명령어를 날려본다.

그럼 바로 해당 쿼리가 나올것이다.

그럼 그 쿼리를 분석하고, 자주 사용하는 쿼리인지 아닌지를 확인하고 인덱스 생성 여부를 결정한다.

반응형
db.currentOp({
  "active": true,
  "op": "query",
  "$where": function() {
    var query = this.query || {};
    var collName = this.ns || "";
    collName = collName.split(".")[1] || "";
    var explain = db.getSiblingDB(this.db).runCommand({
      "explain": {
        "find": collName,
        "filter": query
      }
    });
    return explain.queryPlanner.winningPlan.stage === "COLLSCAN";
  }
})

이게 내가 몽고디비를 안정적으로 운영하는 노하우다.

큰 노하우는 아니지만 반드시 알아야 하는 주요 명령어라고 생각한다.

mongodb를 다양한 사이트가 생기길 바라며 ㅎㅎ

이글을 줄이겠다.

반응형