티스토리 뷰

Database/mongoDB

[MongoDB] 인덱스 예제

데브포유 2017. 3. 22. 10:13
반응형

# 몽고디비 인덱스

  :인덱스명은 자동생성되며, 인덱스명으로 제어는 불가능함.

  

>> 생성

db.컬렉션.createIndex()


>> 조회

db.컬렉션.getIndexes()


>> 삭제

db.컬렉션.dropIndex() or dropIndexes()

db.runCommnad({dropIndex:'emp', index:{eno:-1}})


>> 인덱스 재생성

db.컬렉션.reIndex()


>> 실습 (1:오름차순, -1:내림차순)

 db.employees.createIndex({comm:1})

 db.employees.getIndexes()

 db.employees.reIndex()

 

 db.employees.createIndex({empno:1})               -- 싱글키 인덱스

 db.employees.createIndex({empno:1, deptno:-1})    -- 복합키 인덱스

 db.employees.createIndex({deptno:1}) 

 db.employees.find({deptno: 10}).pretty()

 

>> 실행계획보기

 db.employees.find({deptno: 10}).explain()

 

>> Unique & Non-Unique 인덱스

 db.employees.dropIndex({empno:1})  

 db.employees.createIndex({empno:1},{unique:true})

 

>> Sparse 인덱스 

  - 조건을 만족하는 데이터의 양과 밀도가 낮은 경우

  - 다음은 comm 값이 존재하는 Document로만 인덱스를 생성

 db.employees.dropIndex({comm:1}) 

 db.employees.createIndex({comm:1},{sparse:true})

 db.employees.find({comm:300}).explain()

 

>> Partial 인덱스 (3.2버전부터 추가됨) 

  - 조건에 만족하는 데이터만을 대상으로 인덱스를 생성

 db.employees.createIndex({deptno:1, ename:1},{partialFilterExpression:{sal:{$gt:500}}})

 db.employees.find({deptno:10, sal:{$gt:2500}}).explain()

 

>> Backgroud 인덱스

  - 시스템자원을 우선적으로 지원받아 생성하게 되는 인덱스임.

    제한적으로 꼭 필요한 경우에만 사용해야 함.

  db.employees.createIndex({hiredate:1},{background:true})

  

>> Covered 인덱스    

  - 인덱스만 검색해서 데이터를 조회하는 경우.

    커버링인덱스임.

  

  db.employees.dropIndex({deptno:1, ename:1})

  db.employees.createIndex({deptno:1, ename:1})

  db.employees.find({deptno:10, ename:"CLARK"}, {_id:0, ename:1})   

  db.employees.find({deptno:10, ename:"CLARK"}, {_id:0, ename:1}).explain() 

 

>> TTL 인덱스

  - 일정시간이 지나면 삭제되는 인덱스, 권장하지 않음

  db.employees.createIndex({hiredate:1},{expireAfterSeconds: 3600})

   

>> GeoSpatial 인덱스 ("2d")

  - db.컬렉션.ensureIndex({필드명:"2d"})         


  db.tel_pos.save({mobile_no:"01012347777",

                   last_pos:[[127.0945116,37.5353970],

                             [126.9815316, 37.5685375],

                             [127.0305035, 37.5017141] 

                            ]}) 

   

  db.tel_pos.save({mobile_no:"01012348888",

                   last_pos:[[127.1353452,37.4576521],

                             [127.1359081, 37.4512311],

                             [125.7823091, 36.3339801] 

                            ]}) 


  db.tel_pos.save({mobile_no:"01012349999",

                   last_pos:[[126.3411234,36.1098761],

                             [124.3410922, 37.3409901],

                             [127.2223331, 37.0912090] 

                            ]})                           

                                 

  db.tel_pos.ensureIndex({last_pos:"2d"})                  

  

  db.tel_pos.find({last_pos:{$within :{$centerSphere: [[127.0352915,37.5360206], 30/3963]}}},

                  {_id:0, mobile_no:1, last_pos:1}

                 ).pretty()




 for(var i=0; i<100; i++) db.spatial.insert({pos:[i%10, Math.floor(i/10)]})

 db.spatial.ensureIndex({pos:"2d"})

 

 -- center를 중심으로 가장 가까운 좌표 조회

 db.spatial.find({pos:{$near:[5,5]}}).limit(5)

 

 -- center로부터 가장 가까운 원형좌표 조회

 db.spatial.find({pos:{$within:{$center:[[5,5],2]}}},

                 {_id:0}    

                )

 

 -- 해당좌표로부터 가장 가까운 Box형 좌표 조회

 db.spatial.find({pos:{$within:{$box:[[5,5],[6,6]]}}}, {_id:0})               

                

 -- 다각형 조회

 db.spatial.find({pos:{$within:{$polygon:[[3,3],[5,7],[7,4]]}}}, {_id:0})  

                  

>> GeoMetry 인덱스 ("2dsphere")

  - 3가지 인덱스 타입이 있음

  - Point, LineString, Polygon 타입

  

  db.position.drop()

  db.position.ensureIndex({loc:"2dsphere"})

  

  db.position.insert({"_id":"m239092",

                       "data_type":NumberLong(1),

                       "loc" : {"type":"Point", "coordinates":[127.1058431, 37.5164113]},

                       "pos_name":["name=잠실역 2호선", "trans_type=지하철"]

                    })


  db.position.insert({"_id":"m239091",

                       "data_type":NumberLong(1),

                       "loc" : {"type":"Point", "coordinates":[127.0980748, 37.5301218]},

                       "pos_name":["name=동서울터미널", "trans_type=버스터미널"]

                    })

                    

  db.position.insert({"_id":"m239090",

                       "data_type":NumberLong(1),

                       "loc" : {"type":"Point", "coordinates":[127.0952154, 37.5398467]},

                       "pos_name":["name=강변역 2호선", "trans_type=지하철"]

                    })

                    

  db.position.insert({"_id":"m239089",

                       "data_type":NumberLong(1),

                       "loc" : {"type":"Point", "coordinates":[127.0742172, 37.5419541]},

                       "pos_name":["name=건국대학역 2호선", "trans_type=지하철"]

                    })                                          

  

 

 db.position.find({loc:{$near :{$geometry:{type:"Point", coordinates:[127.1058431, 37.5164113]}, $maxDistance: 2000}}}).pretty()

                   

 -- 3km이내

 db.position.find({loc:{$near :{$geometry:{type:"Point", coordinates:[127.1058431, 37.5164113]}, $maxDistance: 3000}}}).pretty()

 

 

db.position.insert( { "_id" : "m239093", "data_type" : NumberLong(1), "loc" : { "type" : "Point", "coordinates" : [127.0846600, 37.5120906] }, "pos_name"  : [ "name=신천역 2호선", "trans_type=지하철" ] })

db.position.insert( { "_id" : "m239094", "data_type" : NumberLong(1), "loc" : { "type" : "Point", "coordinates" : [127.0740075, 37.5133497] }, "pos_name"  : [ "name=종합운동장역 2호선", "trans_type=지하철" ] })

db.position.insert( { "_id" : "m239095", "data_type" : NumberLong(1), "loc" : { "type" : "Point", "coordinates" : [127.0847829, 37.5105344] }, "pos_name"  : [ "name=삼성역 2호선", "trans_type=지하철" ] })



db.position.find({loc: {$geoIntersects:{$geometry: {type: "LineString", 

                        coordinates:[[127.1058431, 37.5164113],

                                     [127.0740075, 37.5133497],

                                     [127.0847829, 37.5105344]

                        ]}}}}).pretty()

 

db.position.insert( { "_id" : "m12901", 

                     "loc" : { "type" : "Point", 

                               "coordinates" : [127.126178, 37.5140978] }, 

                     "pos_name"  : [ "add_name=체육대학교 수영장", 

                                     "add_type=Public Sport" ]

                  })


db.position.insert( { "_id" : "m12902", 

                     "loc" : { "type" : "Point", 

                               "coordinates" : [127.1224733, 37.5239739] }, 

                     "pos_name"  : [ "add_name=올림픽 수영장", 

                                     "add_type=Resturant" ]

                  }) 

                  

db.position.find({"loc":

                  {$geoWithin:

                   {$geometry:

                   {"type":"Polygon",

                    "coordinates":[[[127.1261076, 37.5191452],

                                   [127.1220412, 37.5221428],

                                   [127.1224733, 37.5239739],

                                   [127.1269535, 37.5231093],

                                   [127.1290333, 37.5179105],

                                   [127.1239271, 37.5116750],

                                   [127.1261076, 37.5191452]

                                 ]]

                   }

                   }

                  }

                }).pretty()

 

 

- EOF -

반응형