[MongoDB] 다양한 Index

기훈·2024년 3월 24일

MongoDB

목록 보기
17/28

TTL Index: 시간을 기준으로 자동으로 생성된 도큐먼트를 삭제한다. 날짜를 기준으로 하는, 또는 날짜를 가지고 있는 배열을 포함하는 싱글필드 인덱스만 생성 가능하다.


테스트 데이터 생성 -> 인덱스 적용(60초 후 삭제) -> 데이터 검색(삭제되어 검색되지 않음)


Unique Index: 중복된 값을 허용하지 않는다 (_id에는 기본적으로 적용된며 이미 중복된 데이터에는 생성할 수 없다)

name 필드에 유니크 인덱스 생성 -> 데이터 삽입(tom,john) -> 데이터 삽입(tom) -> 유니크 인덱스 오류 발생


Unique Index + Compound Index

name + age에 인덱스 생성 -> 데이터 생성(james,23) -> 데이터 생성(james,24) -> 정상 실행


Sparse Index: 필드가 존재한 경우에만 인덱스를 설정한다.

데이터 생성(x:1,x:2,y:1) -> x에 관한 인덱스 생성 -> x에 관한 데이터 조회
(기본 find옵션을 주면 생성했던 데이터가 전부 출력 되지만, hint({x:1})을 주면 x에 관한 데이터만 출력된다)


Sparse + PartialFilterExpression: 조건에 도큐먼트에 대해서만 인덱싱함

데이터생성(x가 존재하고, x가 2보다 커야함) -> 데이터 조회


Hidden Index: query planner로 부터 인덱스를 숨겨 해당 인덱스를 사용하지 못하게 함.
(인덱스를 삭제하기 전, Hidden Index로 미리 테스트 할 수 있다)


// 쿼리플랜으로 해당인덱스를 사용하지 못하도록 숨김
// 운영중인 서비스에서 특정 인덱스를 드랍하고 싶다 -> 예상치못한 이슈 발생할 수 있음 -> 히든으로 처리 한 후 테스트 진행 -> 삭제
// 삭제하기전 테스트하기 용이함
db.hidden.insertOne({ a: 1 })
db.hidden.insertOne({ a: 2 })

db.hidden.createIndex(
	{ a: 1 },
	{hidden: true}
)

/**
 *  a:1 hidden 되었기 때문에 COLLSCAN으로 작동한다.
 *  executionStages: {
      stage: 'COLLSCAN',
      filter: { a: { '$eq': 1 } },
      nReturned: 1,
      executionTimeMillisEstimate: 0,
      works: 3,
      advanced: 1,
      needTime: 1,
      needYield: 0,
      saveState: 0,
      restoreState: 0,
      isEOF: 1,
      direction: 'forward',
      docsExamined: 2
    }
  },
  command: { find: 'hidden', filter: { a: 1 }, '$db': 'test' },
 */
db.hidden.find(
	{a: 1}
).explain('executionStats')


// 권한이 없으면 해제할 수 없다는 오류
// MongoServerError[AtlasError]: user is not allowed to do action [collMod] on [test.hidden] 
// 아틀라스에서 유저에게 권한을 부여해야 함
db.hidden.unhideIndex({ a: 1 })


/**
 * hidden이 해제되어 IXSCAN로 작동함
 *  executionStages: {
      stage: 'FETCH',
      nReturned: 1,
      executionTimeMillisEstimate: 0,
      works: 2,
      advanced: 1,
      needTime: 0,
      needYield: 0,
      saveState: 0,
      restoreState: 0,
      isEOF: 1,
      docsExamined: 1,
      alreadyHasObj: 0,
      inputStage: {
        stage: 'IXSCAN',
        nReturned: 1,
        executionTimeMillisEstimate: 0,
        works: 2,
        advanced: 1,
        needTime: 0,
        needYield: 0,
        saveState: 0,
        restoreState: 0,
        isEOF: 1,
        keyPattern: { a: 1 },
        indexName: 'a_1',
        isMultiKey: false,
        multiKeyPaths: { a: [] },
        isUnique: false,
        isSparse: false,
        isPartial: false,
        indexVersion: 2,
        direction: 'forward',
        indexBounds: { a: [ '[1, 1]' ] },
        keysExamined: 1,
        seeks: 1,
        dupsTested: 0,
        dupsDropped: 0
      }
    }
  },
  command: { find: 'hidden', filter: { a: 1 }, '$db': 'test' },
 */
db.hidden.find(
	{a: 1}
).explain('executionStats')

0개의 댓글