728x90
반응형
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})
텍스트 인덱스
- 인덱스를 지정할 때 text를 색인 키로 지정
- $text 쿼리 연산자 사용 가능
db.book.createIndex({<field1>:"text"})
- 문자열 필드의 인덱스 설계 전략
- String 타입의 필드 값에 대해 조건 조회를 할 경우, $regex 연산자를 사용하여 정규식으로 해당 조건과 일치하는 도큐먼트 조회
- 1. String 타입 필드에 인덱스가 생성되어 있지 않으면 대상 컬렉션에 풀스캔이 발생한다. 2. 인덱스가 생성되어 있을 경우, 일치 조건(eq = /keyword/)은 인덱스를 사용한다. 3. 인덱스가 생성되어 있을 경우, 접두어 조건(startsWith = /^keyword/) 또한 인덱스를 사용한다. 4. 인덱스가 생성되어 있더라도, 접미어 조건(startsWith = /keyword$/)은 인덱스를 사용하지 않는다. 5. 인덱스가 생성되어 있더라도, 포함 조건(contains = /.*keyword.*/)은 인덱스를 사용하지 않는다.
- 풀텍스트 검색(FTS)을 원한다면 text 인덱스를 생성하면 된다. (영어만 가능)
인덱스 문법
인덱스 생성
db.book.createIndex({name:1}) # name키에 인덱스 설정
db.book.createIndex({name:"text"}) # name키에 텍스트 인덱스 생성
인덱스 조회
- 인덱스는 처음 db를 만들 때 자동 생성되는 system.indexes 컬렉션에 저장
db.book.getIndexes();
인덱스 제거
- 특정/모든 인덱스 제거
# 특정 인덱스 제거
db.book.dropIndex(필드이름);
# 모두 제거
db.book.dropIndexes();
인덱스 조합
- 두 인덱스를 모두 사용하여 조회
db.monsters.find({ name: 'Slime', hp: { $gt: 10 } })
인덱스 단점
- 인덱스 자체가 용량을 차지.
- 과사용 금지
반응형
'데이터베이스 > MongoDB' 카테고리의 다른 글
JSON & BSON (0) | 2024.04.01 |
---|---|
보안 설정 & 커넥션 생성 (0) | 2024.04.01 |
조회(find), query연산자 (0) | 2024.04.01 |
생성, 제거, 업데이트 (0) | 2024.04.01 |
NoSQL (0) | 2024.04.01 |