<Index>
mongoDB에서 index 및 멀티index가 가능하다.
(default는 _Id 가 인덱스이다.)
<DB daata>
db.nameage.find()
{ "_id" : ObjectId("561ddb57e8c49d6d56c71503"), "name" : "kim", "age" : 2 }
인덱스 추가시
> db.nameage.ensureIndex( {name:1} ) or
> db.nameage.createIndex( {name:1, age:-1} ) // -1=descending.. compound index.
index show
> db.nameage..getIndexes()
> db.namegae.dropIndex( {name:1} )
조회시 index 사용하는지 확인.
> db.nameage.find({name:"kim"}).explain()
MultiKey index (for array index) : age가 array라면 자동으로 MultiKey index 가 됨.
- explain()해보면 isMultiKey: true라고 나옴.
- name이 array라고 되고, age가 array라도 됨.
=> 단, name과 age 둘 다 array 로 doc insert하면.. insert 실패 남.
-array 안에 subDoc이 있을 때, .(dot)을 사용해 index 생성가능. names:[ { country:"kor", name:"yong" }, { country:"nz", name:"gary"} ]
> db.nameage.createIndex( {names.name:1} )
tip: subDoc조회시에는 $elemMatch 사용가능.
Unique Index
> db.nameage.createIndex( {name:1}, {unique:true} )
unique index를 만들면서, sparse 옵션을 주면 unique이긴 하지만, 그 필드가 없어도 된다.
> db.nameage.createIndex( {name:1}, {unique:true, sparse:true} )
단, sparse index 일 경우, sort()명령에서는 index 사용을 못함.
<Storage Engine>
Mongo서버가---> StorageEngine을 통해서 --> disk에 접근.
MongoDB에는 2가지 storageEngine이 있다.
1. linux기본의 mmap (이게 3.0에서도 default)
- collection 레벨 locking
- 2의 승수(power of 2) document 생성. (즉, 4,8,16,32 byte단위로 update여유 있게 생성)
2. WiredTiger ( 최근에 인수.) mongoDB 3.0부터 지원,
- document 레벨 locking
- 압축 지원
- no in-place Update (즉, update 하면 doc을 항상 추가함) : 이게 doc 레벨 lockding의 원동력임.
사용법: 시작시 $ mongod -storageEngine wiredTiger (-dbpath wT)