[MongoDB] Index

2020. 12. 19. 02:28Database/MongoDB

1. Index

1) Index

인덱스는 MongoDB에서 데이터 쿼리를 더욱 효울적으로 사용하는데 필요하다. 만약 인덱스가 없다면 MongoDB는 컬레션의 데이터를 하나하나 조회하는 방식으로 스캔을 하게 되고, Document의 갯수가 많을 수록 속도가 느려진다. 반대로 인덱스를 사용한다면 더 적은 횟수의 조회로 원하는 데이터를 찾을 수 있다.

 

Document의 필드에 인덱스를 설정하면, 데이터의 키 값을 가지고 Document들을 가르키는 포인터값으로 이루어진 B-Tree(Balanced Binary search Tree)로 만든다. B-Tree는 Binary Search를 통해 쿼리 속도를 빠르게 향상 시킬 수 있다.

 

B-Tree의 구조를 간단하게 살펴본다면, 작은 값은 왼쪽에 큰 값은 오른쪽에 위치하는 규칙을 가지고 있다.

B-Tree

2) 기본 인덱스 (_id)

모든 MongoDB의 컬렉션은 기본적으로 '_id' 필드에 인덱스가 존재한다. 만약 컬렉션을 만들 때 '_id' 필드를 따로 지정하지 않으면 mongod 드라이버가 자동으로 값을 ObjectId로 설정해준다. '_id' 인덱스는 유일(Unique)하고, MongoDB 클라이언트가 같은 '_id'를 가진 문서를 중복적으로 추가하는 것을 방지한다.

3) 싱글 필드 인덱스

MongoDB 드라이버가 지정하는 '_id' 인덱스 외에도 사용자가 지정할 수 있는 단일 필드 인덱스가 존재한다.

싱글 필드 인덱스

4) 복합 필드 인덱스

복합 필드 인덱스는 두 개 이상의 필드를 사용하는 인덱스를 지칭한다. 예를 들어 userid는 오름차순으로, score는 내림차순으로 정렬하는 경우에 사용된다.

복합 필드 인덱스

5) 멀티키 인덱스

필드 타입이 배열인 필드에 인덱스를 적용할 때 멀티키 인덱스가 사용된다. 이 인덱스를 사용하여 배열에 특정 값이 포함되어 있는 Document를 효율적으로 스캔할 수 있다.

멀티키 인덱스

6) 그 외

그 외에는 지도의 좌표와 같은 데이터를 효율적으로 쿼리하기 위해서 사용되는 공간적 인덱스, 텍스트 관련 데이터를 효율적으로 쿼리하기 위해서 사용되는 텍스트 인덱스, B-Tree가 아닌 Hash 자료구조(검색 효율은 좋지만 정렬하지 않음)를 사용하는 해쉬 인덱스가 존재한다.

 

 

 

2. Index 조작

1) Index 생성

db.collection.createIndex( { <키>: 1 } )
db.collection.createIndex( { score: 1 } )
db.collection.createIndex( { score: { $gt: 60 } } )

2) Index 속성

인덱스에 속성을 추가할 경우 createIndex() 메서드의 두번째 인자에 속성값을 Document 타입으로 전달해주면 된다.

db.collection.createIndex( { <키>: 1 }, { <속성>: true } )

Unique 속성을 부여하는 방법은 다음과 같다.

db.collection.createIndex( { email: 1 }, { unique: true } )
db.collection.createIndex( { firstName: 1, lastName: 1 }, { unique: true } )

Partial 부분적 속성은 Document의 조건을 정하여 일부 Document에만 인덱스를 적용할 때 사용된다. 이 속성을 사용하면 필요한 부분에만 인덱싱을 사용하여 저장공간도 아끼고 속도를 더 높일 수 있다. 부분적 속성을 부여하는 방법은 다음과 같다.

// 방문자가 1000보다 높은 Document에만 name 필드에 인덱스 적용
db.store.createIndex(
  { name: 1 },
  { partialFilterExpression: { visitors: { $gt: 1000 } } }
)

TLL 속성은 데이터 타입, 혹은 Date 배열 타입의 필드에 적용할 수 있다. 이 속성을 사용하여 Document를 만료 시킬 수 있다. 즉, 추가하고 특정 시간이 지나면 Document를 컬렉션에서 제거할 수 있다 .TLL 속성을 부여하는 방법은 다음과 같다.

db.notifications.createIndex( { "notifiedDate": 1 }, { expireAfterSeconds: 3600 } )

3) Index 조회 및 제거

// 조회
db.collection.getIndexes()

// 삭제
db.collection.dropIndex( { <키>: 1 } )

[참고] velopert.com/560

728x90

'Database > MongoDB' 카테고리의 다른 글

[MongoDB] 보안  (1) 2020.12.20
[MongoDB] 잠금, 트랜잭션  (0) 2020.12.19
[MongoDB] Aggregation Pipeline  (0) 2020.12.18
[MongoDB] Sharding (Shard, Config Server, Mongos)  (0) 2020.12.18