Search

인덱스(Index)

대분류
DB
소분류
Mongo
설명
인덱스 종류 및 문법
유형
사용법
명령어
주요 레퍼런스
https://inpa.tistory.com/entry/MONGO-%F0%9F%93%9A-Index-%EC%A0%95%EB%A6%AC#%EB%AA%BD%EA%B3%A0%EB%94%94%EB%B9%84_%EC%9D%B8%EB%8D%B1%EC%8A%A4
https://velopert.com/560
https://www.mongodb.com/docs/v3.2/indexes/
최종 편집 일시
2024/10/31 03:29
생성 일시
2024/01/17 06:10
13 more properties

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
복사

인덱스 단점

인덱스 자체가 용량을 차지.
과사용 금지