MongoDB Index

YoungJoon Suh·2022년 4월 15일
0

저장된 데이터의 크기가 커지면 쿼리의 결과를 얻기까지 기다리는 시간은 점점 늘어납니다. 쿼리의 속도가 느려지는 경우(slow query)를 해결하기 위한 방법 중 하나로 인덱싱을 사용할 수 있습니다.
db.infantsInfo.find({"height"80}).sort("weight":1).pretty()
컬렉션을 전부 조회하면서 height 필드가 80인 도큐먼트를 골라내고, 그 도큐먼트를 다시 weight 기준으로 정렬합니다.
height 필드와 weight 필드를 기준으로 다중 인덱스(compound index)를 만들면, 모든 도큐먼트를 조회할 필요가 없습니다.
어떤 필드에 대한 인덱스를 만드는 것은 해당 필드의 값을 기준으로 도큐먼트의 위치 정보를 담은 데이터를 생성하는 것입니다.
다중 인덱스만 있는 것이 아니라 단순하게 사용할 수 있는 단일 필드 인덱스도 설정할 수 있습니다.
db.infantsInfo.find({"height":{ $gt:80 }})
height 필드로 인덱스를 설정하고 비교 연산자를 사용해 쿼리문을 작성하면, 오름차순으로 데이터를 조회합니다.
인덱스는 쿼리를 효율적으로 하기 위한 자료구조이다.

createIndex
인덱스를 생성하기 위해서는 createIndex()라는 메소드를 사용합니다.
createIndex의 파라미터로 인덱스를 적용할 필드를 전달합니다.
값을 1로 지정하면 오름차순, -1로 하면 내림차순으로 정렬합니다.
필드명을 1개를 지정하면 단일 필드 인덱스, 필드명이 2개 이상이면 다중 인덱스(compound index)이다.
db.collection_name.createIndex({<필드명>: 1, <필드명>: -1})
createIndex() 메소드의 두 번때 파라미터로 속성을 추가할 수 있다.
db.collection_name.createIndex({<필드명>:1}, {<속성 property>:true})

  • 속성의 종류
  1. Unique(유일한 속성): _id 필드와 같이 컬렉션에 단 한 개의 값만 존재할 수 있는 속성입니다.
    이 속성을 각 인덱스에 적용할 수 있습니다.
    members라는 컬렉션의 각 도큐먼트에 존재하는 user_id 필드의 인덱스를 중복 값이 없는 유일한 필드로 생성한다.
    db.members.createIndex({ "user_id": 1 }, { unique: true } )

  2. Partial(부분적 속성): 도큐먼트의 조건을 정해 일부 도큐먼트에만 인덱스를 적용합니다.
    필요한 부분에만 인덱스를 사용하여 효율적으로 쿼리를 할 수 있습니다.
    partialFilterExpression 옵션을 사용합니다.
    db.restaurants.createIndex({"cuisine":1, "name":1}, {partialFilterExpression:{ rating: {$gt:4}}})
    restaurants 컬렉션에 cuisine, name이라는 두 개의 필드를 사용하여 다중 인덱스(compound index)를 생성한다. 이 인덱스는 별점이 4점 이상인 도큐먼트에만 적용됩니다.
    partialFilterExpression 옵션을 사용해 일부 도큐먼트에만 인덱스를 적용합니다.

  3. TTL(Time-To-Live): 이 속성은 Date 타입 혹은 Date 배열 타입의 필드에 적용 가능합니다.
    이 속성을 사용하면 특정 시간이 지난 후, 도큐먼트를 컬렉션에서 삭제합니다.
    인덱스에 TTL 속성을 추가하고, 이에 따라 lastModifiedDate와 3600초 이상 차이가 나면 도큐먼트를 컬렉션에서 제거한다.
    db.eventlog.createIndex({"lastModifiedDate": 1}, { expireAfterSeconds: 3600 } )
    lastModifiedDate와 3600초 이상 차이가 나면 도큐먼트를 컬렉션에서 제거합니다.

  • 생성한 인덱스를 확인하거나, 삭제하는 방법
    getIndexes: 생성된 인덱스를 조회할 때 사용함.
    db.collection_name.getIndexes()
    여기서 인덱스를 createIndex로 생성한다면, 생성된 인덱스는 배열에 삽입됩니다.
    생성된 인덱스를 삭제할 때는 dropIndex 메소드를 사용합니다.
    db.collection_name.dropIndex(name)
    db.collection_name.dropIndex(:1})

getIndexes 메소드를 사용하면, 해당 인덱스마다 "name"이라는 필드를 지정할 수 있다는 것을 확인할 수 있습니다.
따라서 dropIndex 메소드의 파라미터로 name 필드의 값을 입력하면 됩니다.
삭제하려는 인덱스의 필드와 지정했던 값을 파라미터로 전달해 주어도 삭제가 가능합니다.
모든 인덱스를 삭제하고 싶은 때에는 복수형의 메소드를 사용한다.
db.collection_name.dropIndexes()

활용하기
infantsInfo 컬렉션의 각 도큐먼트에서 키가 80cm인 영유아의 몸무게 정보를 오름차순으로 받아와야 합니다.
db.infantsInfo.find({"tall":80}).sort("weight":1).pretty()

tall과 weight에 대한 다중 인덱스(compound index)를 만들 수 있습니다.
db.infantsInfo.createIndex({"tall":1, "weight":1})
다중 인덱스로 조건에 맞는 도큐먼트를 검색합니다.
두 필드에 대한 다중 인덱스(compound index)가 생성되면, 이 인덱스를 기준으로 특수한 자료구조가 생성됩니다. 이 인덱스 값을 기준으로 조회를 하면 더 이상 모든 데이터를 조회하지 않고, 해당 자료 구조만 조회하여 쿼리하는 작업을 수행할 수 있습니다.

profile
저는 서영준 입니다.

0개의 댓글