NestJS(typegoose)에서 MongoDB를 빠르게 탐색하기 위해 인덱스를 사용하는 방법, explain.executionStats를 사용하여 실행속도 확인
아래와 같이 십만개(100,000)의 더미 유저 데이터가 있다.
데이터의 형식은
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목록은 다음과 같다.
인덱싱이 걸린 후의 Index목록은 다음과 같다.
'데이터베이스 > MongoDB' 카테고리의 다른 글
[MongoDB] 쿼리 및 프로젝션 연산자 - 2. 요소, 평가 연산자 (0) | 2023.03.07 |
---|---|
[MongoDB] 쿼리 및 프로젝션 연산자 - 1. 비교, 논리 연산자 (0) | 2023.03.07 |
mongoose, typegoose, nestjs-typegoose, kindagoose 설치 명령어 (0) | 2023.03.03 |
[Mongoose] Query Casting (0) | 2023.03.02 |
[Mongoose] Delete관련, 차이점 (0) | 2023.03.01 |
댓글