얼마 전 수 많은 데이터를 처리해야하는 웹사이트를 구축하면서 데이터베이스를 NoSQL, MongoDB로 처리하였습니다. MongoDB를 사용했던 이유는 조금이라도 빠르고 간단한 개발 프로세스가 목적이었죠. 혼자서 개발에 많은 시간을 최대한 줄이려면 상대적으로 NoSQL이 편하다고 생각했습니다.
# NoSQL 성능 개선 및 팁 정리아래는 MongoDB를 사용하면서 겪었던 어려움과 성능 개선을 위한 방법들을 정리한 내용입니다. 이 중에서도 중요한 부분들을 위주로 적어보았습니다.


! 정확하고 효과적인 인덱스 설정RDB와 마찬가지로 많은 데이터베이스가 인덱스 기능을 지원합니다. 산재된 수 많은 데이트를 검색할 때 인덱스를 설정한 것과 하지 않는 것은 검색이나 소팅을 수행할때 엄청난 속도 차이를 보여주게됩니다. 또한 인덱스를 설정시 어떤 필드인지... 멀티 필드를 설정할 것인... 마지막으로 오름 또는 내림차순 중 어떤 방헁으로 설정할 것인지 잘 판단해서 설정하도록합니다.


! 조건이 많은 쿼리문 작성시 불필요한 필드검색은 제외쿼리를 작성할 경우 여러가지 조건을 많이 조합하여 검색하는 경우가 있을 수 있죠. 이 경우 불필요한 조건이 필드 조건이 포함될 수 있으니 주의해야합니다. 예를들어 멤버를 찾기 위한 쿼리문을 작성시 이름만 검색하면 되는데 나이나 주소에 대한 필터링 조건이 없음에도 불구하고 쿼리문에 포함될 수 있겠죠.

@ 결과는 같으나 조건식이 다른 쿼리문
나이를 예로들어보겠습니다. 나이에 상관없이 검색할 수 있는 쿼리문은 나이 필터링 조건이 없는 것과 나이 조건이 0~200으로 설정하여도 결과는 같을 것입니다. 이 같은 실수는 매우 쉽게 나타날 수 있는데 비록 쿼리문이 결과는 같을지라도 검색에 걸리는 시간은 큰 차이가 날 수 있기 때문에 매우 주의해야합니다. 또 다른 예로 성별 설정을 하는 경우를 생각해봅시다. 성별 조건을 빼는 것과 성별 조건에 남 그리고 여 모두를 찾는 것~ 이 둘은 결과는 같지만 성능에 큰 차이를 가질 수 있죠.


! 전역 검색 및 정규표현식 사용의 최소화만약 주소의 일부를 전체 주소에서 검색시 세 가지 방법을 생각할 수 있습니다.

  • - 완전히 일치하는 주소
  • - 시작부터는 완전 일치하고 뒤는 무시하는 주소
  • - 주소를 일부 포함하는 등의 정규식을 사용하는 경우

이처럼 어떤 방법으로 검색하느냐에 따라서 그 차이는 매우 큽니다. 여기서는 당연히 완전히 일치하는 조건인 처음의 필터링 조건이 가장 빠릅니다. 그리고 일부를 포함하거나 비슷한 정규표현식을 사용하는 경우가 가장 느립니다. 실제로 약 100만개가 넘는 데이터를 가지고 위의 방법으로 검색 조건을 실행하면 그 차이가 매우 심합니다. 여기서 이런 방식의 필터링 조건이 and나 or에 의해서 여러번 사용되었다면? 천배, 만배 까지도 차이가 나타날 수 있습니다.

실제로 주소의 시, 구, 동 세가지 검색 조건을 가지고 포함하기만 하면 되는 조건 그리고 반드시 일치해야만 하는 경우를 비교해보았습니다. 이 전자의 경우는 몇 초 단위로 나타난 다면 후자는 대부분 바로 결과를 알 수 있었을 정도로 차이가 극명합니다.


! 최대 로딩 시간을 설정할 것, maxTimeMS()쿼리를 사용하여 검색을 수행시 최대시간을 설정하는 것이 가능합니다. 예를들어 최대 5초 등의 설정을 쿼리에 추가하면 5초가 지나는 경우 데이터베이스 서버에서 오류가 발생해 검색을 중지하게됩니다. 이를 설정하기 위해서 maxTimreMS()를 설정할 수 있습니다.

검색요청이 지나치게 오래 걸리는 쿼리가 반복되는 경우 서버 자체가 재기능을 바뤼하기 어려울 수 있으므래 적절한 시간을 설정하도록 합니다.



# 마치면서여기까지 MongoDB를 사용하여 대규모 데이터베이스(거래내역, 댓글 등등)를 사용하면서 겪었던 문제들을 간단하게 나타내보았습니다. MongoDB 역시 얼마나 많은 데이터를 어떻게 사용하느냐에 따른 초반 설계를 명확히 하고 검색 또는 소팅 등을 사용시 가장 효과적인 쿼리를 작성, 사용하여야 성능 상의 이슈가 크게 나타나지 않을 것입니다.

또한 MongoDB를 사용하면서 높은 하드웨어 성능보다도 쿼리 최적화 등의 기술적인 방법들이 더욱 중요하다는 것을 느낄 수 있었습니다.