SlideShare a Scribd company logo
1 of 33
MongoDB 성능최적화 전략
대구개발자그룹
Jinwook Jeong
Indexing Strategy and query optimization
MongoDB
목차
• MongoDB 기본
• 데이터모델링
– References
– Embedding
• Index
– 인덱스 배경
– 인덱스 생성
– 인덱스 전략
• Aggregation Pipieline
• 고급기능활용
MongoDB
MongoDB 기본
• 쉘 명령어
– 서버실행  mongod --dbpath d:mongo
– 몽고쉘  mongo
– DB선택  use blog
– 현재DB명  db
– 기타
• show dbs
• show collections
• show users
• ..
http://docs.mongodb.org/v3.0/core/data-modeling-introduction/
MongoDB
MongoDB 기본
• CRUD
– Create
• db:blog.insert(삽입정보)
– Read
• db.blog.findOne()
• db.blog.find().limit(3)  앞에서 3개 문서반환
• db.blog.find().skip(3)  offset, 3개 이후부터..
• db.blog.find().skip(Math.floor(Math.random()*db.blog.count())).limit(1)  랜덤찾
기
• db.blog.find().limit(3).sort({“key1”:-1})  key1부터(-1:내림차순)
• db.blog.find({"$query":{"key1":"value1"}})  modifier 이용
• db.blog.find({"$query":{"key1":"value1"},"$orderby":{"x":1}})  modifier 이용한
orderby
– Update
• db.blog.update(조건,업데이트정보)
– Delete
• db.blog.remove(조건)
MongoDB
데이터 모델링
• References
– 문서간 Reference형태로 관련 데이터에 대한 접근이 가능함
MongoDB
데이터 모델링
• Embedded data
– single document에 sub-document를 포함하는 구조로 모델링을 함
– 문서(BSON)는 16MB를 넘을수 없다는 점을 유의할 필요가 있음
• http://docs.mongodb.org/master/reference/limits/
MongoDB
Index 배경
• Index를 사용하는 이유
• 거대한 컬렉션에 대해 Read Operation이 느릴때
– Read operation시 Table scan(정보전체에 대한 읽기)이 일어남
– 거대한 컬렉션에서 Table scan이 일어난다면서버는 Table scan이
일어나지 않도록 해야함
MongoDB
Index 배경
• Index의 효과
– 인덱스는 DB 테이블에 대한 동작속도를 높여주는 자료구조로, 저장된
자료에대한 빠른조회를 위해 생성 (Index ↔ Full Table Scan)
– 인덱스는 키-필드 형태를 가지며, Scan을 거치지 않고, 원하는 문서 위
치주소로 바로 이동함
MongoDB
Index 배경
• 몽고DB Index에 대한 특징
– MongoDB automatically creates a unique index on the _idfield.
• Index 생성시 알아둘점
– 각 Index는 8KB의 데이터 공간을 필요로함
– Index생성시 write 및 update operation 성능을 떨어뜨림
– Index는 system.indexes 컬렉션에 저장됨
• db.system.indexes.find() 로 색인된키 확인가능
MongoDB
Index 생성
• 오름차순/내림차순에 대한 색인
– 키가 하나 일때는 키 방향이 무의미, 키가 하나 이상일 경우 고려함
• 단일키에서 특정M키는 방향과 관계없이 명확함
– 최적화시 정렬방향을 고려함
• {“username”:1,”age”:-1} 내림차순 최적화
• {“username”:1,“age”:1} 오름차순 최적화
• {“comments.date”:1} 내장문서 comments에 있는 date키에 대한 색인
– 예
• 수백만 사용자에 대한 상태메시지
– {date:-1, user:1}
MongoDB
Index 생성
• 인덱스 생성
– db.people.find({“username”:”david”})에 대한 인덱스 생성은
db.people.ensureIndex({“username”:1})
db.people.ensuerIndex({“date”:1,“username:”:1})  1은 오름차순 방향
– 고유 인덱스 생성
• db.user.ensureIndex({"userid":1},{"unique":true})
• db.system.indexes.find()
• 고유 인덱스는 삭제불가.. (_id  로 생성됨)
MongoDB
Index 생성
– 중복제거 (dropDups) 옵션
• db.user.insert({"userid":"hello1"})
• db.user.insert({"userid":"hello1"})
• db.user.insert({"userid":"hello2"})
• db.user.insert({"userid":"hello2"})
• db.user.ensuerIndex({"userid":1},{"unique":true,"dropDups":true})
unique 하지 않아서 발생되는 에러
MongoDB
Index 생성
• 인덱스 생성과 삭제(특정문서)
– db.hello.insert({"name":"wook"})
– db.hello.ensureIndex({"name":1})
– db.hello.ensureIndex({"name":2})
– db.system.indexes.find()
– db.hello.dropIndex({"name":1})  특정 문서만 삭제
– db.hello.dropIndex({"name":2})
– db.system.indexes.find()
_id는 인덱스가 자동으로 생성되었음에 유의
MongoDB
Index 생성
• 인덱스 삭제 (인덱스이름 이용)
– index 이름을 이용한 삭제
– db.hello.dropIndex("name_1")
– db.hello.dropIndex("name_2")
– db.system.indexes.find()
MongoDB
Index 생성
• 특정컬렉션내 인덱스 모두삭제
– db.user.ensureIndex( { userid : 1 })
– db.user.ensureIndex( { userid2 : 1 })
– db.user.find()
– db.runCommand({"dropIndexes":"user","index":"*"})
MongoDB
Index 생성
• 특정컬렉션내 인덱스 Background 삭제
– 새로운 생성시 시간이 걸리고 자원을 많이 잡아 먹으므로, background
옵션을 이용하여, 이를 뒷단에서 색인을 생성하도록 함
– 예
• db.user.ensureIndex( { userid : 1 },{"background":true})
• db.user.ensureIndex( { userid2 : 1 },{"background":true})
MongoDB
Index 생성
• _id는 삭제할 수 있는가?
– _id 기본 index는 삭제할수 없음
• capped collections을 제외하고, id_field는 자동으로 생성되며, 삭제불가
• _id index는 키의 유일함을 강제함 (샤딩은 제외)
– db.hello.drop()  컬렉션 삭제시 인덱스도 삭제됨
http://api.mongodb.org/wiki/current/Indexes.html#Indexes-The%5CidIndex
MongoDB
Index 생성
• 공간정보색인
– 위도,경도에 가까운 영화관을 찾을때 공간색인을 이용함
– 공간정보 색인
• 1 or -1대신, 2d를 넣음
• db.map.ensureIndex({"gps":"2d"})
– 유효키 예
• {"gps":[0,100]}
• {"gps":{"x":-30,"y":30}}
• {"gps":{"lat":-180,"long":180}}
MongoDB
Index 생성
– 2d지정 예
• db.map.ensureIndex({"gps":"2d"})
• db.map.insert({"gps":[0,100]})
• db.map.insert({"gps":{"x":-30,"y":30}})
• db.map.insert({"gps":{"lat":-180,"long":180}})
MongoDB
Index 생성
– 범위지정 예
• db.map.ensureIndex({"gps2":"2d"},{"min":-1000,"max":1000})
• db.map.insert({"gps2":[-1001,0]})
범위 벗어났을때 오류
MongoDB
Index 생성
– 복합공간 정보색인 질의
• db.map.ensureIndex({"gps3":"2d"},{"min":-1000,"max":1000},{"desc":1})
• db.map.insert({"gps3":[50,70],"desc":"coffe"})
• db.map.insert({"gps3":[60,70],"desc":"coffe"})
• db.map.find({"gps3":{"$near":[56,70]},"desc":"coffe"})
MongoDB
Index 전략
• 주의사항
– 모든 Key에 대해 색인하지 않는다.
• 공간이 늘어날 수 있으며, 모든 Key에 인덱싱을 걸었다고 하여도, 쿼리속도
가 크게 빨라지지 않는다.
• 색인생성시 입력, 갱신, 삭제에 대한 Cost가 발생함
– DB연산 수행뿐 아니라, 컬렉션 내 모든 색인에도 반영이 필요하므로
– 컬렉션의 절반이상을 반환하는 경우는 사용하지 않음
• 모든 문서에 대해 키를 찾아 살피는것보다, 그냥 테이블 스캔을 하는 것이
훨씬 효율적
MongoDB
Index 전략
• Mongo DB에서 지원하는 Index 목록
– Single Field indexes
• 문서에 대해 single field에 대한 인덱스
• db.friends.createIndex( { "name" : 1 } )
– Compound Indexes
• 1개 필드 이상에 대한 인덱스..
• db.products.createIndex( { "item": 1, "stock": 1 } )
– Multikey Indexes
• array field에 대한 인덱스..
• db.survey.createIndex( { ratings: 1 } )
– Geospatial Indexes and Queries
• location-based 검색에 이용되며, 데이터는 GeoJSON object 형태로 저장
– Text Indexs
• string 컨텐츠에 대한 인덱스를 지원
– Hashed Index
• hash function 기반 인덱스, multi-key(arrays)에 대해 지원안함
• db.active.createIndex( { a: "hashed" } )
http://docs.mongodb.org/master/core/indexes/
MongoDB
Index 전략
• 쿼리도구 explain 활용
– explain : 쿼리수행결과 통계정보를 통한 성능개선점 찾기
– cursor.explain()
• db.collection.find().explain()
MongoDB
Aggregation Pipeline
• Count
– 컬렉션내 문서수 반환
• db.user.insert({"userid":"id1"})
• db.user.insert({"userid":"id2"})
• db.user.count()
• Distinct
– 고유한 키 값을 찾음
• db.user.insert({"userid":"id1"})
• db.user.insert({"userid":"id2"})
• db.user.insert({"userid":"id1"})
• db.user.distinct("userid")  runCommand
http://docs.mongodb.org/manual/reference/method/db.collection.distinct/
MongoDB
Aggregation Pipeline
• gorup
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") }
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") }
{ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") }
{ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") }
 Group 연산을 위한 데이터준비를 위한 Insert
db.product.insert({ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") })
db.product.insert({ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") })
db.product.insert({ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") })
db.product.insert({ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-
04T11:21:39.736Z") })
db.product.insert({ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-
04T21:23:13.331Z") })
http://docs.mongodb.org/manual/reference/operator/aggregation/group/
• Group으로 집계
MongoDB
Aggregation Pipeline
db.sales.aggregate(
[
{
$group : {
_id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year:
"$date" } },
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)
_id(생략시 fail)를 date필드를
이용하여 구성함
MongoDB
고급기능활용
• 명령어 수행
– MongGoDB는 75개 이상의 명령어를 제공하며, 명령어 최신 목록은
http://docs.mongodb.org/manual/reference/command/ 에서 확인가
능
– 명령어 실행
• db.runCommand({“명령어이름”:”...”})
• db.runCommand({"buildInfo":"1"})  관리자 전용 명령어
• db.runCommand({"collStats":"foo"})  컬렉션 정보
– 예 : 전체 인덱스 사이즈, 인덱스 개수, capped 상태, 스토리지 사이즈, 문서개수
등..
• ...
MongoDB
고급기능활용
• Collection (=table)
– 삽입시 컬렉션 자동생성
• use blog;
• db.board_articles.insert({“title”:”hello”})
– 컬렉셩생성
• use blog;
db.createCollection(“board_articles");
• show collections; (show tables와 동일)
– 컬렉션삭제
• db.컬렉션이름.drop()
• db.runCommand({"drop":"user"})
MongoDB
고급기능활용
• Capped Collection (제한컬렉션)
– 고정사이즈 컬렉션으로, insert와 retrieve시 high-throughput를 가짐
– insertion 순서 보장하며
– 정렬을 위해 인덱스가 필요로 하지 않으며, 오버헤드 없이 higher
insertion throughput 가능
• 최소사이즈 (byte)
– db.createCollection( "log", { capped: true, size: 100000 } )
• 문서개수 제한
– db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
http://docs.mongodb.org/manual/core/capped-collections/#CappedCollections-UsageandRestrictions
MongoDB
고급기능활용
• Capped Collection (제한컬렉션)의 순차정렬 특성
– 문서는 항상 입력순서대로 원형큐에 저장
– 큐가 다 찼을 경우, 오래된 문서부터 대치됨
– 비제한 컬렉션은 순서정렬이 보장되지 않음
제한 컬렉션의 원형큐형태의 저장
MongoDB
고급기능활용
• Capped Collection의 역순서 정렬
– db.user.insert({"userid":"hello1"})
– db.user.insert({"userid":"hello2"})
– db.user.find().sort({"$natural":-1})
MongoDB
고급기능활용
• Tailable Cursor
– capped collection의 문서를 모두 꺼내었어도, 원형큐의 특성처럼 종료
되지 않고 문서를 꺼냄
$cursor = $collection->find()->tailable();
while (true) {
if (!$cursor->hasNext()) {
if ($cursor->dead()) {
break;
}
sleep(1);
}
else {
while ($cursor->hasNext()) {
do_stuff($cursor->getNext());
}
}
}

More Related Content

What's hot

What's hot (20)

Indexing with MongoDB
Indexing with MongoDBIndexing with MongoDB
Indexing with MongoDB
 
MongoDB Aggregation
MongoDB Aggregation MongoDB Aggregation
MongoDB Aggregation
 
MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용
 
My first 90 days with ClickHouse.pdf
My first 90 days with ClickHouse.pdfMy first 90 days with ClickHouse.pdf
My first 90 days with ClickHouse.pdf
 
Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기
 
MongodB Internals
MongodB InternalsMongodB Internals
MongodB Internals
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation Framework
 
Mongo DB Presentation
Mongo DB PresentationMongo DB Presentation
Mongo DB Presentation
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바
 
MySQL Timeout Variables Explained
MySQL Timeout Variables Explained MySQL Timeout Variables Explained
MySQL Timeout Variables Explained
 
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
 
MongoDB Fundamentals
MongoDB FundamentalsMongoDB Fundamentals
MongoDB Fundamentals
 
차곡차곡 쉽게 알아가는 Elasticsearch와 Node.js
차곡차곡 쉽게 알아가는 Elasticsearch와 Node.js차곡차곡 쉽게 알아가는 Elasticsearch와 Node.js
차곡차곡 쉽게 알아가는 Elasticsearch와 Node.js
 
Mvcc in postgreSQL 권건우
Mvcc in postgreSQL 권건우Mvcc in postgreSQL 권건우
Mvcc in postgreSQL 권건우
 
Indexing and Performance Tuning
Indexing and Performance TuningIndexing and Performance Tuning
Indexing and Performance Tuning
 
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
 
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
[pgday.Seoul 2022] POSTGRES 테스트코드로 기여하기 - 이동욱
 
MongoDB .local Toronto 2019: Tips and Tricks for Effective Indexing
MongoDB .local Toronto 2019: Tips and Tricks for Effective IndexingMongoDB .local Toronto 2019: Tips and Tricks for Effective Indexing
MongoDB .local Toronto 2019: Tips and Tricks for Effective Indexing
 
PostgreSQL 15 and its Major Features -(Aakash M - Mydbops) - Mydbops Opensour...
PostgreSQL 15 and its Major Features -(Aakash M - Mydbops) - Mydbops Opensour...PostgreSQL 15 and its Major Features -(Aakash M - Mydbops) - Mydbops Opensour...
PostgreSQL 15 and its Major Features -(Aakash M - Mydbops) - Mydbops Opensour...
 
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
 

Similar to Mongo DB 성능최적화 전략

Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
OnGameServer
 
Mongo db로 배우는 nosql
Mongo db로 배우는 nosqlMongo db로 배우는 nosql
Mongo db로 배우는 nosql
Suwon Chae
 
Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범)
Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범) Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범)
Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범)
InBum Kim
 
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
sung ki choi
 
Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0
cho hyun jong
 
9장. 문서 데이터베이스
9장. 문서 데이터베이스9장. 문서 데이터베이스
9장. 문서 데이터베이스
kidoki
 

Similar to Mongo DB 성능최적화 전략 (20)

Mongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDMongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUD
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
Mongo db로 배우는 nosql
Mongo db로 배우는 nosqlMongo db로 배우는 nosql
Mongo db로 배우는 nosql
 
Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범)
Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범) Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범)
Using R with MongoDB(R User Conference Korea 2015, SK C&C 김인범)
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
Node.js + Express + MongoDB
Node.js + Express + MongoDBNode.js + Express + MongoDB
Node.js + Express + MongoDB
 
Mongodb and spatial
Mongodb and spatialMongodb and spatial
Mongodb and spatial
 
Introduction to mongo db
Introduction to mongo dbIntroduction to mongo db
Introduction to mongo db
 
201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide
 
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
 
Amazon DynamoDB
Amazon DynamoDBAmazon DynamoDB
Amazon DynamoDB
 
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
 
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
 
개발자가 알면 좋은 Mongodb
개발자가 알면 좋은 Mongodb개발자가 알면 좋은 Mongodb
개발자가 알면 좋은 Mongodb
 
Python codelab2
Python codelab2Python codelab2
Python codelab2
 
Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0
 
집단 지성 (Programming collective intelligence) 스터디: Chapter 4 - Searching & Ranking
집단 지성 (Programming collective intelligence) 스터디: Chapter 4 - Searching & Ranking집단 지성 (Programming collective intelligence) 스터디: Chapter 4 - Searching & Ranking
집단 지성 (Programming collective intelligence) 스터디: Chapter 4 - Searching & Ranking
 
9장. 문서 데이터베이스
9장. 문서 데이터베이스9장. 문서 데이터베이스
9장. 문서 데이터베이스
 
Backend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsBackend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build tools
 

More from Jin wook

More from Jin wook (12)

자연어처리 소개
자연어처리 소개자연어처리 소개
자연어처리 소개
 
클린 아키텍처 재해석
클린 아키텍처 재해석클린 아키텍처 재해석
클린 아키텍처 재해석
 
Angular2를 위한 컴포넌트 분석과 개발
Angular2를 위한 컴포넌트 분석과 개발Angular2를 위한 컴포넌트 분석과 개발
Angular2를 위한 컴포넌트 분석과 개발
 
Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발
 
MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)
 
PHP를 위한 NginX(엔진엑스) 시작과 설정
PHP를 위한 NginX(엔진엑스) 시작과 설정PHP를 위한 NginX(엔진엑스) 시작과 설정
PHP를 위한 NginX(엔진엑스) 시작과 설정
 
아파치 쓰리프트 (Apache Thrift)
아파치 쓰리프트 (Apache Thrift) 아파치 쓰리프트 (Apache Thrift)
아파치 쓰리프트 (Apache Thrift)
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
파이썬(Python) 소개
파이썬(Python) 소개파이썬(Python) 소개
파이썬(Python) 소개
 
빅 데이터 개요 및 활용
빅 데이터 개요 및 활용빅 데이터 개요 및 활용
빅 데이터 개요 및 활용
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 

Mongo DB 성능최적화 전략

  • 1. MongoDB 성능최적화 전략 대구개발자그룹 Jinwook Jeong Indexing Strategy and query optimization
  • 2. MongoDB 목차 • MongoDB 기본 • 데이터모델링 – References – Embedding • Index – 인덱스 배경 – 인덱스 생성 – 인덱스 전략 • Aggregation Pipieline • 고급기능활용
  • 3. MongoDB MongoDB 기본 • 쉘 명령어 – 서버실행  mongod --dbpath d:mongo – 몽고쉘  mongo – DB선택  use blog – 현재DB명  db – 기타 • show dbs • show collections • show users • .. http://docs.mongodb.org/v3.0/core/data-modeling-introduction/
  • 4. MongoDB MongoDB 기본 • CRUD – Create • db:blog.insert(삽입정보) – Read • db.blog.findOne() • db.blog.find().limit(3)  앞에서 3개 문서반환 • db.blog.find().skip(3)  offset, 3개 이후부터.. • db.blog.find().skip(Math.floor(Math.random()*db.blog.count())).limit(1)  랜덤찾 기 • db.blog.find().limit(3).sort({“key1”:-1})  key1부터(-1:내림차순) • db.blog.find({"$query":{"key1":"value1"}})  modifier 이용 • db.blog.find({"$query":{"key1":"value1"},"$orderby":{"x":1}})  modifier 이용한 orderby – Update • db.blog.update(조건,업데이트정보) – Delete • db.blog.remove(조건)
  • 5. MongoDB 데이터 모델링 • References – 문서간 Reference형태로 관련 데이터에 대한 접근이 가능함
  • 6. MongoDB 데이터 모델링 • Embedded data – single document에 sub-document를 포함하는 구조로 모델링을 함 – 문서(BSON)는 16MB를 넘을수 없다는 점을 유의할 필요가 있음 • http://docs.mongodb.org/master/reference/limits/
  • 7. MongoDB Index 배경 • Index를 사용하는 이유 • 거대한 컬렉션에 대해 Read Operation이 느릴때 – Read operation시 Table scan(정보전체에 대한 읽기)이 일어남 – 거대한 컬렉션에서 Table scan이 일어난다면서버는 Table scan이 일어나지 않도록 해야함
  • 8. MongoDB Index 배경 • Index의 효과 – 인덱스는 DB 테이블에 대한 동작속도를 높여주는 자료구조로, 저장된 자료에대한 빠른조회를 위해 생성 (Index ↔ Full Table Scan) – 인덱스는 키-필드 형태를 가지며, Scan을 거치지 않고, 원하는 문서 위 치주소로 바로 이동함
  • 9. MongoDB Index 배경 • 몽고DB Index에 대한 특징 – MongoDB automatically creates a unique index on the _idfield. • Index 생성시 알아둘점 – 각 Index는 8KB의 데이터 공간을 필요로함 – Index생성시 write 및 update operation 성능을 떨어뜨림 – Index는 system.indexes 컬렉션에 저장됨 • db.system.indexes.find() 로 색인된키 확인가능
  • 10. MongoDB Index 생성 • 오름차순/내림차순에 대한 색인 – 키가 하나 일때는 키 방향이 무의미, 키가 하나 이상일 경우 고려함 • 단일키에서 특정M키는 방향과 관계없이 명확함 – 최적화시 정렬방향을 고려함 • {“username”:1,”age”:-1} 내림차순 최적화 • {“username”:1,“age”:1} 오름차순 최적화 • {“comments.date”:1} 내장문서 comments에 있는 date키에 대한 색인 – 예 • 수백만 사용자에 대한 상태메시지 – {date:-1, user:1}
  • 11. MongoDB Index 생성 • 인덱스 생성 – db.people.find({“username”:”david”})에 대한 인덱스 생성은 db.people.ensureIndex({“username”:1}) db.people.ensuerIndex({“date”:1,“username:”:1})  1은 오름차순 방향 – 고유 인덱스 생성 • db.user.ensureIndex({"userid":1},{"unique":true}) • db.system.indexes.find() • 고유 인덱스는 삭제불가.. (_id  로 생성됨)
  • 12. MongoDB Index 생성 – 중복제거 (dropDups) 옵션 • db.user.insert({"userid":"hello1"}) • db.user.insert({"userid":"hello1"}) • db.user.insert({"userid":"hello2"}) • db.user.insert({"userid":"hello2"}) • db.user.ensuerIndex({"userid":1},{"unique":true,"dropDups":true}) unique 하지 않아서 발생되는 에러
  • 13. MongoDB Index 생성 • 인덱스 생성과 삭제(특정문서) – db.hello.insert({"name":"wook"}) – db.hello.ensureIndex({"name":1}) – db.hello.ensureIndex({"name":2}) – db.system.indexes.find() – db.hello.dropIndex({"name":1})  특정 문서만 삭제 – db.hello.dropIndex({"name":2}) – db.system.indexes.find() _id는 인덱스가 자동으로 생성되었음에 유의
  • 14. MongoDB Index 생성 • 인덱스 삭제 (인덱스이름 이용) – index 이름을 이용한 삭제 – db.hello.dropIndex("name_1") – db.hello.dropIndex("name_2") – db.system.indexes.find()
  • 15. MongoDB Index 생성 • 특정컬렉션내 인덱스 모두삭제 – db.user.ensureIndex( { userid : 1 }) – db.user.ensureIndex( { userid2 : 1 }) – db.user.find() – db.runCommand({"dropIndexes":"user","index":"*"})
  • 16. MongoDB Index 생성 • 특정컬렉션내 인덱스 Background 삭제 – 새로운 생성시 시간이 걸리고 자원을 많이 잡아 먹으므로, background 옵션을 이용하여, 이를 뒷단에서 색인을 생성하도록 함 – 예 • db.user.ensureIndex( { userid : 1 },{"background":true}) • db.user.ensureIndex( { userid2 : 1 },{"background":true})
  • 17. MongoDB Index 생성 • _id는 삭제할 수 있는가? – _id 기본 index는 삭제할수 없음 • capped collections을 제외하고, id_field는 자동으로 생성되며, 삭제불가 • _id index는 키의 유일함을 강제함 (샤딩은 제외) – db.hello.drop()  컬렉션 삭제시 인덱스도 삭제됨 http://api.mongodb.org/wiki/current/Indexes.html#Indexes-The%5CidIndex
  • 18. MongoDB Index 생성 • 공간정보색인 – 위도,경도에 가까운 영화관을 찾을때 공간색인을 이용함 – 공간정보 색인 • 1 or -1대신, 2d를 넣음 • db.map.ensureIndex({"gps":"2d"}) – 유효키 예 • {"gps":[0,100]} • {"gps":{"x":-30,"y":30}} • {"gps":{"lat":-180,"long":180}}
  • 19. MongoDB Index 생성 – 2d지정 예 • db.map.ensureIndex({"gps":"2d"}) • db.map.insert({"gps":[0,100]}) • db.map.insert({"gps":{"x":-30,"y":30}}) • db.map.insert({"gps":{"lat":-180,"long":180}})
  • 20. MongoDB Index 생성 – 범위지정 예 • db.map.ensureIndex({"gps2":"2d"},{"min":-1000,"max":1000}) • db.map.insert({"gps2":[-1001,0]}) 범위 벗어났을때 오류
  • 21. MongoDB Index 생성 – 복합공간 정보색인 질의 • db.map.ensureIndex({"gps3":"2d"},{"min":-1000,"max":1000},{"desc":1}) • db.map.insert({"gps3":[50,70],"desc":"coffe"}) • db.map.insert({"gps3":[60,70],"desc":"coffe"}) • db.map.find({"gps3":{"$near":[56,70]},"desc":"coffe"})
  • 22. MongoDB Index 전략 • 주의사항 – 모든 Key에 대해 색인하지 않는다. • 공간이 늘어날 수 있으며, 모든 Key에 인덱싱을 걸었다고 하여도, 쿼리속도 가 크게 빨라지지 않는다. • 색인생성시 입력, 갱신, 삭제에 대한 Cost가 발생함 – DB연산 수행뿐 아니라, 컬렉션 내 모든 색인에도 반영이 필요하므로 – 컬렉션의 절반이상을 반환하는 경우는 사용하지 않음 • 모든 문서에 대해 키를 찾아 살피는것보다, 그냥 테이블 스캔을 하는 것이 훨씬 효율적
  • 23. MongoDB Index 전략 • Mongo DB에서 지원하는 Index 목록 – Single Field indexes • 문서에 대해 single field에 대한 인덱스 • db.friends.createIndex( { "name" : 1 } ) – Compound Indexes • 1개 필드 이상에 대한 인덱스.. • db.products.createIndex( { "item": 1, "stock": 1 } ) – Multikey Indexes • array field에 대한 인덱스.. • db.survey.createIndex( { ratings: 1 } ) – Geospatial Indexes and Queries • location-based 검색에 이용되며, 데이터는 GeoJSON object 형태로 저장 – Text Indexs • string 컨텐츠에 대한 인덱스를 지원 – Hashed Index • hash function 기반 인덱스, multi-key(arrays)에 대해 지원안함 • db.active.createIndex( { a: "hashed" } ) http://docs.mongodb.org/master/core/indexes/
  • 24. MongoDB Index 전략 • 쿼리도구 explain 활용 – explain : 쿼리수행결과 통계정보를 통한 성능개선점 찾기 – cursor.explain() • db.collection.find().explain()
  • 25. MongoDB Aggregation Pipeline • Count – 컬렉션내 문서수 반환 • db.user.insert({"userid":"id1"}) • db.user.insert({"userid":"id2"}) • db.user.count() • Distinct – 고유한 키 값을 찾음 • db.user.insert({"userid":"id1"}) • db.user.insert({"userid":"id2"}) • db.user.insert({"userid":"id1"}) • db.user.distinct("userid")  runCommand http://docs.mongodb.org/manual/reference/method/db.collection.distinct/
  • 26. MongoDB Aggregation Pipeline • gorup { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") } { "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") } { "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") } { "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") }  Group 연산을 위한 데이터준비를 위한 Insert db.product.insert({ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") }) db.product.insert({ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") }) db.product.insert({ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") }) db.product.insert({ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04- 04T11:21:39.736Z") }) db.product.insert({ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04- 04T21:23:13.331Z") }) http://docs.mongodb.org/manual/reference/operator/aggregation/group/
  • 27. • Group으로 집계 MongoDB Aggregation Pipeline db.sales.aggregate( [ { $group : { _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } }, totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, averageQuantity: { $avg: "$quantity" }, count: { $sum: 1 } } } ] ) _id(생략시 fail)를 date필드를 이용하여 구성함
  • 28. MongoDB 고급기능활용 • 명령어 수행 – MongGoDB는 75개 이상의 명령어를 제공하며, 명령어 최신 목록은 http://docs.mongodb.org/manual/reference/command/ 에서 확인가 능 – 명령어 실행 • db.runCommand({“명령어이름”:”...”}) • db.runCommand({"buildInfo":"1"})  관리자 전용 명령어 • db.runCommand({"collStats":"foo"})  컬렉션 정보 – 예 : 전체 인덱스 사이즈, 인덱스 개수, capped 상태, 스토리지 사이즈, 문서개수 등.. • ...
  • 29. MongoDB 고급기능활용 • Collection (=table) – 삽입시 컬렉션 자동생성 • use blog; • db.board_articles.insert({“title”:”hello”}) – 컬렉셩생성 • use blog; db.createCollection(“board_articles"); • show collections; (show tables와 동일) – 컬렉션삭제 • db.컬렉션이름.drop() • db.runCommand({"drop":"user"})
  • 30. MongoDB 고급기능활용 • Capped Collection (제한컬렉션) – 고정사이즈 컬렉션으로, insert와 retrieve시 high-throughput를 가짐 – insertion 순서 보장하며 – 정렬을 위해 인덱스가 필요로 하지 않으며, 오버헤드 없이 higher insertion throughput 가능 • 최소사이즈 (byte) – db.createCollection( "log", { capped: true, size: 100000 } ) • 문서개수 제한 – db.createCollection("log", { capped : true, size : 5242880, max : 5000 } ) http://docs.mongodb.org/manual/core/capped-collections/#CappedCollections-UsageandRestrictions
  • 31. MongoDB 고급기능활용 • Capped Collection (제한컬렉션)의 순차정렬 특성 – 문서는 항상 입력순서대로 원형큐에 저장 – 큐가 다 찼을 경우, 오래된 문서부터 대치됨 – 비제한 컬렉션은 순서정렬이 보장되지 않음 제한 컬렉션의 원형큐형태의 저장
  • 32. MongoDB 고급기능활용 • Capped Collection의 역순서 정렬 – db.user.insert({"userid":"hello1"}) – db.user.insert({"userid":"hello2"}) – db.user.find().sort({"$natural":-1})
  • 33. MongoDB 고급기능활용 • Tailable Cursor – capped collection의 문서를 모두 꺼내었어도, 원형큐의 특성처럼 종료 되지 않고 문서를 꺼냄 $cursor = $collection->find()->tailable(); while (true) { if (!$cursor->hasNext()) { if ($cursor->dead()) { break; } sleep(1); } else { while ($cursor->hasNext()) { do_stuff($cursor->getNext()); } } }

Editor's Notes

  1. Read는 삽입순서가 첫번째인 문서부터 선택
  2. 검색이 빈번하며, 자주 변하지 않는 필드를, Index로 고려
  3. http://docs.mongodb.org/v3.0/core/data-model-operations/
  4. http://docs.mongodb.org/v3.0/core/data-model-operations/
  5. http://docs.mongodb.org/v3.0/core/data-model-operations/
  6. 중복키값이 있어 적용이 안됨.
  7. db.hello.insert({"name":"wook"}) db.hello.ensureIndex({"name":1}) db.hello.ensureIndex({"name":2}) db.system.indexes.find() db.hello.dropIndex({"name":1}) db.hello.dropIndex({"name":2}) db.system.indexes.find()
  8. db.map.ensureIndex({"gps":"2d"}) db.map.insert({"gps":[0,100]}) db.map.insert({"gps":{"x":-30,"y":30}}) db.map.insert({"gps":{"lat":-180,"long":180}})
  9. db.map.ensureIndex({"gps2":"2d"},{"min":-1000,"max":1000}) db.map.insert({"gps2":[-1001,0]})