Index란
자주 조회되는 필드를 따로 저장해서 조회 및 정렬 시의 속도를 빠르게 하는 기법
•
MongoDB는 Collection Scan(컬렉션 데이터를 하나하나 조회하는 방식)으로 데이터를 찾는다.
•
이를 보안하여 Document Field들에 Index를 걸면, 데이터에 설정된 키 값을 가지고 document들을 가르키는 포인터값으로 이뤄진 B-Tree 구조를 만든다.
B-Tree : Balanced Binary search Tree
•
인덱스는 일반 Field 뿐만 아닌, 객체 값을 가지는 Field 내부 속성에도 지정 가능
ex) { name: {first: ‘Zero’, last: ‘Cho’}} → createIndex({ ‘name.last’:1});
Index의 종류
기본 인덱스 : _id
•
기본적으로 MongoDB의 Collection 상에 존재하는 인덱스 (Unique, 중복방)
•
컬렉션을 만들 때 _id 필드를 따로 지정하지 않으면 mongod가 자동으로 _id필드 값을 ObjectID로 설정
Single(단일) 필드 인덱스
•
단일 인덱스 : 하나의 필드만 사용하는 인덱스
Compound(복합) 필드 인덱스
db.COLLECTION_NAME.createIndex({<field1>: 1|-1, <field1>: 1|-1}
•
복합 인덱스 : 두 개 이상의 필드를 사용하는 인덱스
•
순서가 중요하다.
◦
ex) a, b, c 필드 순서대로 인덱스 설정할 경우, 자동으로 a,b 필드에 대한 인덱스도 같이 생성됨.
◦
1 : 오름차순
-1 : 내림차순
•
필드 1개만 조회할 땐 사용 불가
# compound(복합) field index : 복합적으로 key index
db.book.createIndex({name:1, hits:1})
Shell
복사
텍스트 인덱스
•
인덱스를 지정할 때 text를 색인 키로 지정
•
$text 쿼리 연산자 사용 가능
db.book.createIndex({<field1>:"text"})
Shell
복사
•
문자열 필드의 인덱스 설계 전략
◦
String 타입의 필드 값에 대해 조건 조회를 할 경우, $regex 연산자를 사용하여 정규식으로 해당 조건과 일치하는 도큐먼트 조회
1. String 타입 필드에 인덱스가 생성되어 있지 않으면 대상 컬렉션에 풀스캔이 발생한다.
2. 인덱스가 생성되어 있을 경우, 일치 조건(eq = /keyword/)은 인덱스를 사용한다.
3. 인덱스가 생성되어 있을 경우, 접두어 조건(startsWith = /^keyword/) 또한 인덱스를 사용한다.
4. 인덱스가 생성되어 있더라도, 접미어 조건(startsWith = /keyword$/)은 인덱스를 사용하지 않는다.
5. 인덱스가 생성되어 있더라도, 포함 조건(contains = /.*keyword.*/)은 인덱스를 사용하지 않는다.
Shell
복사
◦
풀텍스트 검색(FTS)을 원한다면 text 인덱스를 생성하면 된다. (영어만 가능)
인덱스 문법
인덱스 생성
db.book.createIndex({name:1}) # name키에 인덱스 설정
db.book.createIndex({name:"text"}) # name키에 텍스트 인덱스 생성
Shell
복사
인덱스 조회
•
인덱스는 처음 db를 만들 때 자동 생성되는 system.indexes 컬렉션에 저장
db.book.getIndexes();
Shell
복사
인덱스 제거
•
특정/모든 인덱스 제거
# 특정 인덱스 제거
db.book.dropIndex(필드이름);
# 모두 제거
db.book.dropIndexes();
Shell
복사
인덱스 조합
•
두 인덱스를 모두 사용하여 조회
db.monsters.find({ name: 'Slime', hp: { $gt: 10 } })
Shell
복사
인덱스 단점
•
인덱스 자체가 용량을 차지.
•
과사용 금지