08-18 Index

Ruinak·2021년 8월 18일
0

Bigdata Lesson

목록 보기
14/18
post-thumbnail

1. Index의 기본 개념

Index

  • 데이터베이스 검색 성능을 높이기 위해 사용
  • MongoDB는 고정된 스키마는 없지만 원하는 데이터 필드를 인덱스로 지정하여 검색결과를 빠르게 하는 것이 가능
  • NoSQL에서도 index를 잘 설계해야 최대 검색 효율이 가능
  • B트리 구조로 index구현

인덱스 생성 및 조회

db.emp.createIndex({ eno : 1}, { unique : true });
db.emp.ensureIndex({ eno : 1}, { unique : true });

인덱스 삭제와 재구성

db.employees.getIndexes()
db.employees.dropIndex({ename:1})
db.employees.createIndex({com:1})
db.employees.reIndex()

MongoDB의 인덱스 특징

  • 대소문자 엄격하게 구분
  • Document를 업데이트 할 때 index key만 변경, 변경된 Document 크기가 기존 EXTENT 보다 더 큰 경우 더 큰 공간으로 마이그레이션 될 수 있어 성능 저하 발생
  • sort() 절과 limit 절을 함께 사용하는 것이 성능이 도움이 됨

인덱스의 종류

2. Index 생성 및 관리 (1) - 주요 인덱스

3. Index 사용

Single-key Index & Compound Index

use test
db.employees.getIndexes() # Single-key 인덱스
db.employees.createIndex({empno:1})
db.employees.createIndex({empno:1, deptno:-1}) # Compound 인덱스
db.employees.getIndexes()
db.employees.createIndex({deptno:1})
db.employees.find({deptno:10}).pretty()
db.employees.find({deptno:10}).explain()
db.employees.find({deptno:10}).sort({empno:-1})
db.employees.find({deptno:10}).sort({empno:-1}).explain()
db.employees.dropIndex({empno:1})

Nun-Unique Index & Unique Index

db.employees.createIndex({empno:1},{unique:true})
db.employees.createIndex({enane:1})
db.employees.getIndexes()
db.employees.dropIndex({empno:1})
db.employees.insert({empno:7369, ename:"ADAM"})
db.db.employees.dropIndex({empno:1})
db.employees.find({empno:7369}).pretty()
db.employees.createIndex({empno:1},{unique:true})

Sparse 인덱스

  • 검색대상이 되는 필드가 전체 컬렉션에서 차지하는 밀도가 낮은 경우 생성
db.employees.dropIndex({comm:1})
db.employees.createIndex({domm:1},{sparse:true})
db.employees.find({comm:300}).pretty()
db.employees.find({comm:300}).explain()
db.employees.dropIndex({comm:1})

4. Index 생성 및 관리 (2)

Partial 인덱스

  • 인덱스 필드에 추가 조건을 주어 인덱스를 생성
  • 인덱스 크기를 줄일 수 있다.
db.employees.createIndex({deptno :1,ename:1},
{partialFilterExpression: {sal:{$gt:500} } })
db.employees.getIndexes()
db.employees.find( {deptno: 10, sal : { $gte:2500} } ).pretty()
db.employees.find( {deptno: 10, sal : { $gte:2500} } ).explain()

background 인덱스

  • 대량의 인덱스 생성시 성능저하 현상 유발
  • 인덱스 생성시 활용가능한 system 자원을 이용에 인덱스 작성
db.employees.createIndex( {hiredate: 1},{background: true})
db.employees.find({hiredate: "20-02-1981"})
db.employees.find({hiredate: "20-02-1981"}).explain()
db.employees.find({deptno: 10, ename : "CLARK"}, {_id:0 , ename:1}).explain()

convered 인덱스

  • 검색에 필요한 필드를 모두 인덱스 필드로 하여 인덱스 생성
  • 검색을 할때 실제 데이터에 접근하지 않고 인덱스만으로 데이터를 검색 가능
db.employees.createIndex( {deptno: 1, name:1})
db.employees.find({deptno: 10, ename : "CLARK"}, {_id:0 , ename:1}).explain()

GeoSpatial INDEX

  • 좌표에 의해 구성되는 2차원 구조로 하나의 Collection에 하나의 Index를 생성할 수 있다
for(var i=0;i<100; i++)
  db.spatial.insert({
  	pos : [i%10, Math.floor(i/10)] } )
db.spatial.ensureIndex({ pos : "2d"})
db.spatial.find({pos : {$near : [5,5] } },{_id:0}).limit(5)
{ "pos" : [ 5, 0 ] }
{ "pos" : [ 4, 0 ] }
{ "pos" : [ 6, 0 ] }
{ "pos" : [ 3, 0 ] }
{ "pos" : [ 7, 0 ] }

$CENTER

$BOX

$POLYGON

Multi-Location Documents

db.tel_pos.save( { mobile_no : "01038631858",
  last_pos : [ [127.0945116,37.5353970], [126.9815316,37.5685375], [127.0305035, 37.5017141] ] } )
db.tel_pos.save( {mobile_no : "01075993678",
  last_pos : [ [127.1353452,37.4576521], [127.1359081,37.4512311], [125.7823091, 36.3339801] ] })
db.tel_pos.save( {mobile_no : "01071229021",
  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()

$nearSphere

5. GeoMetry 인덱스

-geoJSON은 직선 또는 곡선의 교차에 의하여 이루어지는 추상적인 구조나 다각형(Polygon)과 같은 기하학(geoMetry)구조를 나타냄

  • 기하학 구조에 만들어지는 인덱스를 GeoMetry 인덱스라고 함.
  • GeoMetry 인덱스 타입

point 타입

실습

  • 인덱스를 직접 추가할 수 있습니다.
  • db.컬렉션이름.createIndex({인덱스이름:값})으로 추가할 수 있습니다.
  • unique도 설정할 수 있습니다.
  • db.컬렉션이름.getIndex( )로 등록된 내 인덱스를 확인할 수 있습니다.
profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글