[빅데이터시스템설계] Indexing

Future·2024년 4월 26일
0

index

특정 필드를 정렬하여 조회 성능을 높일 때 사용되는 기능이다.
mongoDB에서는 B-Tree를 사용한다.

B-Tree 특성

  • 모든 리프 노드는 같은 레벨에 있다.

index를 사용하면 안되는 경우

  • 컬렉션 크기가 작을 때
  • 업데이트, 삽입이 빈번할 때
  • null값이 많은 필드

Single Field Index

한개의 필드로 인덱싱한다.
기본적으로, 모든 컬렉션은 _id 인덱스가 자동으로 생성된다.

  • 단일 필드에 대한 오름차순 인덱스 생성
db.컬렉션_이름.createIndex({필드 : 1})
  • 단일 필드에 대한 내림차순 인덱스 생성
db.컬렉션_이름.createIndex({필드 : -1})

Compound Index

여러 필드를 결합하여 단일 인덱스를 만든다.

  • 필드 1에 대해 오름차순, 필드 2에 대해 내림차순 인덱스 생성
db.컬렉션_이름.createIndex({필드1 : 1, 필드2 : -1})


위 예제에 대해 manufacturer는 오름차순, price는 내림차순으로 하여 compound index를 생성

 db.products.createIndex(manufacturer:1, price:-1)


중요한 것은, 여러 필드를 결합할 때, 순서를 잘 생각해야 한다는 것이다.

index prefix

index prefix란, compound index에서 쿼리할 수 있는 부분집합을 의미한다.
위 예제에서

 db.products.createIndex(product : 1, manufacturer:1, price:-1)

이렇게 compound index를 만들었다면,

  • {product : 1}
  • {product : 1, manufacturer : 1}
  • {product : 1, manufacturer : 1, price : -1}
    이렇게 index prefix가 생긴다. 그러면, 첫번째는 사실상 single field index이기 때문에, 이를 잘 활용한다면 single field index를 따로 만들지 않아도 된다.

ESR(Equality, Sort, Range) rule

Equality, Sort, Range 조건으로 조회할 때, ESR rule을 기반으로 compound index를 생성하여 쿼리 성능을 개선할 수 있다.
이 때, ESR 순서로 compound index를 만들어야 한다.
ex)

 db.cars.find({manufacturer : 'Ford’, cost : {$gt : 10000}}).sort({model : 1})

manufacturer : 'Ford’ -> Equality
cost: { $gt : 10000 } -> Range
sort({model : 1}) -> Sort
==> compound index 생성 (ESR 기반)

db.cars.createIndex{manufacturer : 1, model : 1, cost : 1}

Multi-key Index

필드의 array 값을 인덱싱한다.

  • rating 오름차순 정렬
db.inventory.createIndex({ratings: 1})
profile
Record What I Learned

0개의 댓글