일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 몽고DB
- Pipeline
- 인덱스
- restart
- troubleshooting
- LocalRepository
- httpd
- 확인
- 테크블로그
- deploy
- web
- 톰캣
- longQuery
- maven
- 진행
- no space left
- 무중단
- MongoDB
- 상태
- was
- NoSQL
- projection
- 배포
- kill
- apache
- slowQuery
- 성능
- aggregation
- GRACEFUL
- tomcat
- Today
- Total
목록MongoDB (3)
boogie의 가벼운 개발 일기
현재 재직중이 회사에서 검색 색인 파일을 추출하기 위해 몽고DB의 aggregationPipeline을 사용중이다. 커머스 중에서도 굉장히 복잡한 데이터 스키마를 가진 편이기에, 파이프라인이 복잡한것은 물론이고 lookup하는 컬렉션은 수십개가 되고, 그중 몇몇 컬렉션은 단일 컬렉션의 도큐먼트만 수십억건이 있다. 그렇게 AggregationPipeline을 사용하던 중 의문이 생겼는데, 상식적으로 RDS에서던 NoSQL에서던, 추출되는 결과 컬럼의 갯수를 줄여 꼭 필요한 컬럼만을 추출하는 것이 (SELECT * 을 사용하지 않고 SELECT절에 꼭 필요한 컬럼명만 지정) 성능이 좋다는 것은 튜닝의 기본중의 기본인데 이상하게 문제가 된 대형 Aggregation Query에서는 각 Stage에 $proje..
// 롱 쿼리 확인 db.currentOp({"secs_running":{"$gte":3}}).inprog.forEach( function(op){ printjson(op); } ) // 롱 쿼리 kill db.currentOp({"secs_running":{"$gte":3}}).inprog.forEach( function(op){ db.killOp(op.opid); } ) 종종 application을 강제종료했는데도 쿼리가 계속 실행중인 경우가 있다. 강제 종료 할때는 query들도 모두 종료되었는지 확인하는 습관을 갖는게 좋다
mongoDB는 background로 index를 생성할수 있어서 아주 유용하게 사용하곤 한다. index 생성시 option으로 background:true를 지정하면 백그라운드로 컬렉션에서 진행중인 작업들에 영향을 주지 않고 인덱스 생성이 진행된다. db.collection_name.createIndex({index description}, {options}) ex) db.my_collection.createIndex({field1:1, field2:-1}, {background:true, partialFilterExpression : {field3:{$exists:true}}}) 하지만 진행상태를 콘솔로 찍어주진 않기때문에 진행상태 확인은 아래와 같이 해야한다. db.currentOp(true).i..