[5.1] $연산자의 인덱스 사용법
2022. 7. 30. 16:53ㆍ책/몽고DB 완벽 가이드
어떤 쿼리는 다른 쿼리보다 더 효율적으로 인덱스를 사용하고, 어떤 쿼리는 인덱스를 전혀 사용할 수 없다.
◎ 부정조건
통상 부정 조건은 비효율적이다.
- $ne : 찾고자 하는 부정값이 컬렉션 내에서 큰 부분을 차지하는게 아니라면 컬렉션 스캔을 수행한다
- $not : 쿼리 대부분이 테이블 스캔을 수행한다
- $nin : 항상 테이블 스캔을 수행한다
◎ 범위
이전에도 설명했지만 복합 인덱스 생성 시 동등 쿼리에 사용될 필드를 맨 앞에, 다중값 쿼리가 사용될 필드는 맨 뒤에 두는 것이 효율적이다.
◎ OR
현재 몽고 DB는 쿼리당 하나의 인덱스만 사용할 수 있다. 유일한 예외는 $or 인데, $or를 쓰면 두 개의 쿼리를 수행하고 합친 뒤 중복을 제거하는 개념이므로 각 절마다 하나의 인덱스를 쓸 수 있다.
그러나 이 과정 자체가 훨씬 비효율적이므로 가능하다면 $or 보단 $in을 쓰는게 낫다
1) 하나의 인덱스만 사용
예를 들어 { company : 1 }, { department : 1 }로 인덱스를 각각 만들고,
> db.employees.createIndex({ company: 1 });
> db.employees.createIndex({ department: 1 });
{ company: 'DS', department: 'IT' }로 쿼리를 해도
몽고DB는 인덱스 두 개 중 하나만 사용한다.
> db.employees.find({ company: 'DS', department: 'IT' });
2) $or
> db.employees.find({ $or : [ { company: 'DS' }, { department: 'IT' } ).explain();
각각의 인덱스키를 써서 인덱스 스캔을 2번 한다
근데 두 개를 따로 찾고 → 중복을 찾아서 없앤 뒤 → 병합하는 과정이므로
훨씬 비효율적이다
'책 > 몽고DB 완벽 가이드' 카테고리의 다른 글
[5.1] 객체 및 배열 인덱싱 (0) | 2022.07.30 |
---|---|
[5.1] 인덱스 선택 원리 (0) | 2022.07.30 |
[5.1] 복합인덱스 (0) | 2022.07.28 |
[5.1] 인덱스 (0) | 2022.07.28 |
[4.2] 쿼리 / 쿼리조건(cursor) (0) | 2022.07.26 |