몽고DB 검색문과 커서에 대한 질문 0 2 1,957

by 푸른기린 [DB 기타] [2014.09.02 12:50:53]


몽고db에서 데이터를 조회하는 함수는

find() 와 findOne()이 있는것으로 알고 있습니다.

findOne()은 한건의 데이터만 확인할 수 있으며, 도큐먼트 자체를 반환하고

find()는 여러건의 데이터를 확인 할 수 있으며, 커서를 반환해주고 그것을 반복하여 값을 확인하는 것으로 알고 있습니다.

 

여기서 궁금한 것은

도큐먼트자체를 반환하는것과 커서를 반환하는 것의 차이가 무엇인지 모르겠습니다.

성능상 커서를 이용한 find가 유리한 것은 알게 되었는데

정확히 몽고db의 커서가 어떻게 존재하는것이기에 성능에 유리한지, 

왜 도큐먼트 자체를 반환하면 느린것인지 잘 모르겠습니다.

(디스크 i/o가 발생하는 것인가요? 그렇다면 커서를 사용한다면 디스크 i/o가 발생하지 않는것인지...)

 

도움주신다면 감사하겠습니다.

 

 

by 김치찌게 [2014.09.02 14:11:58]

설명하신 부분에 답이 있는 것 같아 보이는데요. 

findOne : document 반환 ==> read data(data I/O) and return

find : cursor 반환 ==> data read 없이, 참조할 수 있는 cursor 반환

return by value 와 return by referrence 정도의 차이로 보입니다만, 

몽고DB 자체 메뉴얼이나 기술문서에 해당 설명이 없다면 결국은 유추하거나 테스트 결과로 검증할 수 밖에 확인할 수 없지 않을까요? (관련 자료구조를 오픈하지는 않았을 것 같습니다만)

https://blog.serverdensity.com/checking-if-a-document-exists-mongodb-slow-findone-vs-find/

 


by 푸른기린 [2014.09.02 17:31:01]

data의 read는 커서를 통해서도 이루어 지는것으로 보여져서 헷갈리네요.

커서를 통하면 20개의 row씩 반복해서 조회가 가능한데 이때 read가 발생할 수 밖에 없지 않을까

생각해봅니다.. ㅠ

 

오히려 말씀해주신것 처럼 c의 call by value 와 call by reference처럼

findOne의 경우는 데이터를 복사해서 전달해주는 개념이고

find의 개념은 포인터를 전달해주는것으로

복사를 통해 복사작업과 데이터를 올려둘 별도의 공간이 소모되는 것으로 파악해야하는것인지

애매하네요.

 

모쪼록 답변감사합니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입