mongodb sparce index 퀵하게 보기

* mongodb의 index 특징 몇가지
-. array에 index 가능, 각각의 원소가 _id 와 함께 indexing 이됨
-. multi key index가능 : 단!!! 2개 key 이상 모두 배열로 insert 안됨!!
-. unique index 는 key가 없이 insert 될경우 key:null 로 간주하여 dupkey 에러 발생!!

* sparce index 
-> unique index 생성시 key 값이 없어도 insert 가 가능하게함

key로써 a,b,c 가 존재 하는 document 에서
unique와 함께 c로 index 를 걸었을경우
db.test.ensureIndex({c:1},{unique:true, sparse:true}) /* ensureIndex 함수이용 */

a:1 , b:2 , c:3  -> indexing 대상
a:1 , b:3           -> 제외
a:2 , b:3           -> 제외

스파스 인덱스는 인덱스 선언된 key 가 없는 doc의 경우 인덱싱에서 제외됨
-> 인덱스를 통해 접근할경우 key 가 없으면 쿼리 대상에서 제외된다는 이야기
-> 인덱스를 건 시점에서 쿼리 결과가 달라질수 있음
ex) sort 를 할경우 대상에서 제외되버림
-> 초반설계시에 key (컬럼)이 없이 insert 된넘들 ($exists 구문없이) 무시하기에 딱좋겠다.
<퀵하게 보기 끝>

테스트 해보자

테스트 데이터 넣고

> var t = db.test
> db.t.insert({a:1,b:2,c:3})
> db.t.insert({a:4,b:6})
> db.t.insert({a:9,b:11})
> t.find()
{ "_id" : ObjectId("514d541dc19f83d03d5b7706"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("514d543cc19f83d03d5b7707"), "a" : 4, "b" : 6 }
{ "_id" : ObjectId("514d5441c19f83d03d5b7708"), "a" : 9, "b" : 11 }

이빨빠진 “c” key 로 index 걸어보기

> t.ensureIndex({c:1},{unique:true})
E11000 duplicate key error index: ppillip.test.$c_1  dup key: { : null }

-> 역시에러

그럼 이제 unique + sparse index 시도

> db.test.ensureIndex({c:1},{unique:true, sparse:true})

find 로 전체검색 해보면

> t.find()
{ "_id" : ObjectId("514d541dc19f83d03d5b7706"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("514d543cc19f83d03d5b7707"), "a" : 4, "b" : 6 }
{ "_id" : ObjectId("514d5441c19f83d03d5b7708"), "a" : 9, "b" : 11 }

잘나오네

그럼 index 타게 sort 해보면

> t.find().sort({c:1})
{ "_id" : ObjectId("514d541dc19f83d03d5b7706"), "a" : 1, "b" : 2, "c" : 3 }

역시 “c” 없는 document는 무시당했어!! $exists 구문은 안써도 되겠다!

내생각
RDB : (db설계/수정 <-> 개발/수정) * n
noSql : (개발/수정 -> db 반영) * n
“간단하고 빠르게 개발자 위주로 가기는 nosql이 유리하다”는 내생각을 다시한번 확인함

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious