본문 바로가기
데이터베이스/MongoDB

[MongoDB] 빠른 탐색을 위한 인덱싱(indexing)

by minhyeok.lee 2023. 3. 6.
반응형

NestJS(typegoose)에서 MongoDB를 빠르게 탐색하기 위해 인덱스를 사용하는 방법, explain.executionStats를 사용하여 실행속도 확인

아래와 같이 십만개(100,000)의 더미 유저 데이터가 있다. 

100,000개의 dummy user 데이터
100,000개의 dummy user 데이터

데이터의 형식은

1. userBase.name이 userDummy0, userDummy1, userDummy2,  ... , userDummy99999형식으로 되어 있다.

2. userBase.role은 Wrrior, Thief, Magician 중에 랜덤하게 생성되어 있다.

 

 

1. NestJS에서 Index 생성 이전

 'userBase.role'이 'Magician'이고 'userBase.name'에 '3'이 포함된 더미 유저데이터를 찾을 때 걸리는 시간을 찾는 코드

async getUser(): Promise<void> {
    const exc: any = await this.userModel
      .find({
        'userBase.role': 'Magician',
        'userBase.name': { $regex: '3' },
      })
      .explain('executionStatus');

    console.log('인덱싱 전 = ', exc.executionStats.executionTimeMillis);
  }

 

위와 같이 NestJS에서 .explain('executionStatus')를 사용한면 반환 값은 아래와 같다.

...
executionStats: {
  ...
  executionTimeMillis: '반환되는 밀리초'
  ...
}
...

때문에 console.log('인덱싱 전 = ', exc.executionStats.executionTimeMillis)와 같이 콘솔을 찍어주면 결과는 아래와 같다.

 

인덱싱 전 결과
인덱싱 전 결과

인덱싱을 걸기 전에는 위와 같은 결과가 나온다.

오래걸리면 1초 이상도 걸리는 것을 볼 수 있다. (밀리초 단위이므로 0.83, 0.94 ... 등 시간 소요)

 

 

2. NestJS에서 Index 생성 이후

NestJS에서 typegoose를 이용해 데코레이터로 인덱싱을 지원해준다.

@index({
  'userBase.role': 1,
  'userBase.name': 1,
})
export class User extends UserInfo {
  @ApiProperty({ type: Date })
  @IsDateString()
  @IsOptional()
  @prop()
  createdAt?: Date;
}

위와 같이  'userBase.role', 'userBase.name'에 인덱싱을 걸어준다.

 

그 후 똑같이  'userBase.role'이 'Magician'이고 'userBase.name'에 '3'이 포함된 더미 유저데이터를 찾을 때 걸리는 시간을 찾는 코드를 실행한다.

async getUser(): Promise<void> {
    const exc: any = await this.userModel
      .find({
        'userBase.role': 'Magician',
        'userBase.name': { $regex: '3' },
      })
      .explain('executionStatus');

    console.log('인덱싱 후 = ', exc.executionStats.executionTimeMillis);
  }

console.log('인덱싱 후 = ', exc.executionStats.executionTimeMillis)와 같이 콘솔을 찍어주면 결과는 아래와 같다.

인덱싱 후 결과
인덱싱 후 결과

 

인덱스를 건 후에는 위와 같은 결과가 나온다.

인덱싱을 하기 전과 비교하여 시간이 거의 반정도로 줄은 것을 확인할 수 있다.

 

인덱싱이 제대로 걸렸는지 확인해보려면 MongoCompass와 같은 도구로 Index를 확인해본다.

 

 

인덱싱이 걸리기 전의 Index목록은 다음과 같다.

인덱싱을 걸기 전 MongoDB

 

인덱싱이 걸린 후의 Index목록은 다음과 같다.

인덱싱을 건 후 MongoDB
인덱싱을 건 후 MongoDB

반응형

댓글