본문 바로가기
프로그래밍 개발/DB

MongoDB - Index

by Jinseok Kim 2021. 1. 20.
반응형

 

Index

 

  • Index는 MongoDB에서 데이터 쿼리를 더욱 효율적으로 할 수 있게 해준다.
  • 인덱스가 없이는, MongoDB는 collection scan – 컬렉션의 데이터를 하나하나 조회 – 방식으로 스캔을 하게 돤다.
  • 만약 document의 갯수가 매우 많다면, 많은 만큼 속도가 느려지며 이 부분을 향상시키기 위하여 인덱스를 사용하면 더 적은 횟수의 조회로 원하는 데이터를 찾을 수 있다.

 

 

 

 

 

Index의 종류

 

기본 인덱스 _id

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

 

 

Single(단일) 필드 인덱스

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

 

 

 

Compound (복합)  필드 인덱스

두개 이상의 필드를 사용하는 인덱스를 복합 인덱스라고 부른다. 다음 이미지와 같이 첫번째 필드 (userid)는 오름차순으로, 두번째 필드 (score)는 내림차순으로 정렬 해야 하는 상황이 있을때 사용한다.

 

 

 

Multikey 인덱스

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

 

 

 

 

Geospatial(공간적) Index

지도의 좌표와 같은 데이터를 효율적으로 쿼리하기 위해서 (예: 특정 좌표 반경 x 에 해당되는 데이터를 찾을 때) 사용되는 인덱스이다.

 

 

 

 

Text 인덱스

텍스트 관련 데이터를 효율적으로 쿼리하기 위한 인덱스이다.

 

 

 

 

해쉬 (hashed) 인덱스

이 인덱스를 사용하면 B Tree가아닌 Hash 자료구조를 사용한다. Hash는 검색 효율이 B Tree보다 좋지만, 정렬을 하지 않는다.

 

 

 

 

 

 

 

인덱스 생성

 

db.COLLECTION.createIndex( { KEY: 1 } )

인덱스를 생성 할 땐, 다음과 같은 createIndex() 메소드를 사용한다. 파라미터는 인덱스를 적용할 필드를 전달하며 값을 1로하면 오름차순으로, -1로 하면 내림차순으로 정렬한다.

 

 

 

 

 

단일 필드 인덱스 생성

db.report.createIndex( { score: 1 } )

score 필드에 인덱스를 걸어주며 이 인덱스는 다음과 같은 쿼리를 할 때 효율적으로 실행하게 해준다.

 

 

 

 

 

 복합 필드 인덱스 생성

db.report.createIndex( { age: 1, score: -1} )

이렇게 여러 필드를 넣어 인덱스를 생성하면 age를 오름차순으로 정렬한 상태에서 score 는 내림차순으로 정렬한다.

 

 

 

 

 

 

 

 

인덱스 속성

 

 

db.COLLECTION.createIndex( { KEY: 1 }, {  PROPERTY: true } )

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

 

 

 

 

 

Unique (유일함) 속성

 

 

email 인덱스에 unique 속성 적용

db.userinfo.createIndex( { email: 1 }, { unique: true } )

_id 필드처럼 컬렉션에 단 한개의 값만 존재 할 수 있는 속성이다.

 

 

 

 

 

firstName 과 lastName 복합인덱스에 unique 속성 적용

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

unique 속성은 다음처럼 복합 인덱스에도 적용 할 수 있다.

 

 

 

 

 

 

Partial (부분적) 속성

 

  • partial 속성은 document의 조건을 정하여 일부 document에만 인덱스를 적용 할 때 사용된다.
  • partial 속성을 사용하면, 필요한 부분에만 인덱싱을 사용하여 저장공간도 아끼고 속도를 더 높일수 있다.

 

 

visitors 값이 1000 보다 높은 document에만 name 필드에 인덱스 적용

db.store.createIndex( 
   { name: 1 }, 
   { partialFilterExpression: { visitors: { $gt: 1000 } } }
)

 

 

 

 

 

TLL 속성

 

  • 이 인덱스 속성은 Date 타입, 혹은 Date 배열 타입의 필드에 적용 할 수 있는 속성이다.
  • 이 속성을 사용하여 document를 expire(만료) 시킬 수 있다. 즉, 추가하고 특정 시간이 지나면, document 를 컬렉션에서 제거한다.

 

 

notifiedDate 가 현재 시각과 1시간 이상 차이나면 제거

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

document가 만료되어 제거 될 때, 시간이 아주 정확하지는 않는다.

(주의)만료되는 document를 제거하는 thread는 매 60초마다 실행된다. 

 

 

 

 

 

 

 

 

인덱스 조회

 

 

생성된 인덱스를 조회 할 땐 getIndexes() 메소드를 사용한다.

db.COLLECTION.getIndexes()

 

 

 

 

 

 

 

인덱스 제거

 

인덱스를 제거 할 땐 dropIndex() 메소드를 사용한다.

db.COLLECTION.dropIndex( { KEY: 1 } )

( _id 인덱스를 제외한 ) 모든 인덱스를 제거 할 땐 dropIndexes() 메소드를 사용한다.

 

반응형

'프로그래밍 개발 > DB' 카테고리의 다른 글

MongoDB - Document 수정  (0) 2021.01.19
MongoDB - Document Query(조회) 2  (0) 2021.01.18
MongoDB - Document Query(조회)  (0) 2021.01.18
MongoDB - 생성 및 제거하기  (0) 2021.01.15
MongoDB - 기본 설치 및 개념  (0) 2021.01.14

댓글