MongoDB: index

Vorhandenheit ·2022년 1월 13일
0

Database

목록 보기
12/28

Index

인덱스는 DB의 검색을 빠르게 하기 위해 데이터의 순서를 미리 정리해 두는 과정입니다. 원하는 데이터 필드를 인덱스로 지정하여 검색 결과를 빠르게 하는 것이 가능합니다.

  • index는 한 쿼리에 한 index만 유효합니다. 두 개의 index가 필요하다면 복합 index를 사용합니다.
  • index는 어떤 데이터가 도큐먼트에 추가되거나 수정될 때 그 컬렉션에 생성되어 있는 index도 새로운 도큐먼트를 포함시켜 수정됩니다. 이로 인하여 index추가 시 write작업은 느려질 수 있습니다.

1. 인덱스 사용

(1) 인덱스 생성

  • 단일 필드 인덱스
db.users.createIndes({ <field>: 1}) // 값이 1이면 오름차순, -1이면 내림차수누 정렬
  • 복합 필드 인덱스
db.users.createIndex({ age: 1, scrore: -1}) // age를 오름차순으로 정렬한 상태에서 score는 내림차순으로 정렬합니다.

(2) 인덱스 속성

createIndex() 메소드에 두 번쨰 인자는 속성입니다. 이 속성에는 4가지가 있습니다.

A.Unique

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

db.users.createIndex({<field>: 1, {unique:true}}) 

B. Partial

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

db.users.createIndex({<field>: 1}, {partialFilterExpression: {visitors: {$gt: 100}}})

C. TILL

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

db.users.createIndex({<field>: 1}, {expireAfterSeconds: 3600}) //현재 시각과 1시간 이상 차이나면 제거

(3) 인덱스 조회

  • getIndexes()
db.users.getIndexes()

(4) 인덱스 제거

  • dropIndex()
db.users.dropIndex({<field>: 1})

2. 인덱스 종류

인덱스의 종류에는 단일 필드 인덱스, 복합 인덱스, 다중 키 인덱스, geospatial 인덱스, test 인덱스, 해쉬 인덱스가 존재합니다.

(1) Single Field Index(단일 필드 인덱스)

하나의 필드 인덱스를 사용하는 것을 단일 필드 인덱스라고 합니다. MongoDB에서는 기본적으로 컬렉션에 _id 라는 단일 필드 인덱션이 생성됩니다.

(2) Compound Index(복합 인덱스)

두 개 이상의 필드를 사용하는 인덱스를 복합 인덱스라고 부릅니다.
복합인덱스를 사용할 때는 아래와 같은 특징을 고려해야합니다.

    1. sort 연산 시 인덱스 순서를 고려하여 생성
    1. 단일 인덱스와 다르게 복합 인덱스는 정렬 방향을 고려하자
    1. Prefixes
    1. sort 연산은 non-prefix를 지원합니다.
    1. Index Intersection
      인덱스 교차란 별개의 인덱스가 교차해서 쿼리에 자동으로 적용되는 것입니다.

(3) Multikey Index

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

(4) Geospatial Index

지도의 좌표와 같은 데이터를 효율적으로 쿼리하기 위해서 사용되는 인덱스

(5) Hashed Index

B Tress가 아닌 Hash 자료구조를 사용함

출처

https://ryu-e.tistory.com/1
https://velopert.com/560

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글