SOOJLE
수즐 커뮤니티
수즐 커뮤니티
  • SOOJLE Document
  • 프로젝트 요약
  • Untitled
  • 프로젝트 개요
    • 프로젝트 소개
    • 추진 배경 및 필요성
    • 프로젝트 내용
      • 기능적 요구사항
      • 비기능적 요구사항
    • 개발환경 및 팀 구성
    • 워크플로우
      • 계획 수립 & 설계
      • 데이터 수집 및 정규화
      • 인공지능 개발
      • 서비스 모듈 개발
      • 성능 평가 및 보고
    • 프로젝트 예산 내역
  • 사전조사 & 의사결정
    • 사전조사
      • 재학생 대상 사전조사
      • 수집 URL 대상 목록
        • 세종대학교 직할
        • 세종대학교 학과
        • 공식 공지사항
        • 세종대 평생교육원
        • 외부 웹사이트
      • 학습 모델 사전조사
        • LSA - 잠재 의미 분석
        • LDA - 잠재 디리클레 할당
        • Word2Vec - 워드투벡터
        • FastText - 패스트텍스트
    • 의사결정
      • 사용자 인증 방식 의사결정
      • 데이터베이스 의사결정
        • MySQL vs MongoDB 성능 분석
      • 토픽별 의사결정
      • 부가 기능 의사 결정
  • 프로젝트 설계
    • 시스템 구조 설계
    • 핵심 기능 설계
      • 데이터 크롤러 설계
      • 게시물 토픽 정의 및 분류
      • 사용자 관심분야 측정
      • 뉴스피드 설계
        • 사용자-문서 유사도(Recommendation Score)
        • FaS (관심 분야 및 유사도 측정 - 추가)
        • 토픽 뉴스피드 목록
      • 검색 알고리즘 설계
        • 검색 알고리즘 1차 설계
        • 검색 알고리즘 1차 개선안
        • 검색 알고리즘 2차 설계
    • 요구사항 목록
      • DB 요구사항
      • 기능 요구사항
      • 품질 요구사항
      • 관리 요구사항
  • DB
    • 구조 설계
    • 테이블 명세
  • 데이터 크롤러
    • 데이터 크롤러 개요
    • 크롤링 URL 선정
    • 크롤러 구현을 위한 사전조사
    • 크롤러 개발 과정
      • 크롤러 프로그램 설계
      • 크롤러 규격화
      • 크롤러 정규화
      • 데이터 정제 과정
      • 에러 핸들러 구현
      • 배포 환경 이식을 위한 Porting
    • Issue & Exception
    • 결과 보고
  • 인공지능 개발
    • 인공지능 개발 개요
    • NLP 스터디
      • Bag of Words(BoW)
      • Document Term Matrix(DTM)
      • TF-IDF(Term Frequency-Inverse Document Frequency)
      • 문서 유사도(Document Similarity)
    • 데이터 전처리 과정
    • 개발 과정
      • 토크나이저 구현
      • LDA 모델 학습 및 구현
    • LDA 학습 모델링
      • 1차 파라미터 튜닝 결과 (NUM_TOPICS)
      • 2차 파라미터 튜닝 결과 (NUM_TOPICS)
      • 3차 파라미터 튜닝 결과 (NUM_TOPICS)
      • NUM_TOPICS 파라미터 의사결정
      • 4차 파라미터 튜닝 결과 (PASESS, ITERATION)
      • 최종 학습 모델 명세
    • Word2Vec(FastText) 학습 모델링
    • Issue & Exception
    • 성능 분석 결과
  • BackEnd
    • 서버 구축 및 배포
      • SOOJLE 서버 구조
      • 상용 서버 (UWSGI + NGINX) 구축
      • HTTPS 서버 구현
    • API 문서 개요
    • API 목록
      • Analysis
      • Auth API
      • Newsfeed API
      • Post API
      • Search API
      • Admin API
    • 세종 Auth API
    • 통계 기능 설계
    • Issue & Exception
    • 성능 분석 결과
  • FRONTEND
    • 프론트엔드 설계 개요
    • 디자인 설계 의사결정
      • 디자인 컨셉 및 기능 정의
      • 컴포넌트 디자인
      • Logo Variation
    • 화면 흐름도
    • 페이지 UI 명세
      • Main Page
      • Header
      • Footer
      • Mobile Control Bar
      • Login Page
      • Timeline Page
      • Menu Page
      • Hyperlink Icons Page
      • Search Component & Mobile Search Modal
      • Search Page
      • Post Block
      • Snackbar
  • 프로그램 배포
    • 프로그램 개요
    • 시스템 아키텍쳐
    • 주요 기능 및 명세
    • 프로그램 테스트
    • 구현 결과물 배포
  • 마무리
    • References
  • SOOJLE AI
  • SEJONG AUTH
  • IML Tokenizer
  • SOOJLE Crawler
  • SOOJLE Frontend
  • SOOJLE Backend
Powered by GitBook
On this page
  • 개요
  • 테스트 환경
  • 데이터 셋 출처
  • 데이터 셋 삽입
  • INT 성능 비교
  • MySQL - No Index
  • MongoDB - No Index
  • MySQL - Index
  • MongoDB - Index
  • 분석 결과
  • STRING 동치 비교 분석
  • MySQL - No Index
  • MongoDB - No Index
  • MySQL - Index
  • MongoDB - Index
  • 분석 결과
  • STRING 부분 연산
  • MySQL - No Index
  • MongoDB - No Index
  • MySQL - Index
  • MongoDB - Index
  • 분석 결과
  • Array/Join 탐색
  • MySQL(JOIN)
  • MongoDB(Array)
  • 분석 결과
  • 결과 해석

Was this helpful?

  1. 사전조사 & 의사결정
  2. 의사결정
  3. 데이터베이스 의사결정

MySQL vs MongoDB 성능 분석

데이터베이스 의사결정을 하기 위한 분석 보고서이다.

Previous데이터베이스 의사결정Next토픽별 의사결정

Last updated 5 years ago

Was this helpful?

개요

프로젝트를 수행하기에 앞서, 적절한 DBMS를 선정하기 위해 2개의 상용 데이터베이스의 성능을 비교하기 위해 지정된 시나리오에 따라 테스트를 진행하였다.

테스트 환경

구분

내용

OS

MacOS Mojabe 10.14.5

MySQL

5.7.26

MongoDB

4.0.3

CPU

INTEL I5 7267U 7th Kaby Lake

RAM

8GB

Data Set

나무위키 데이터베이스 덤프(약 7GB)

데이터 셋 출처

데이터 셋 삽입

테스트에 들어가기 앞서, 나무 위키 데이터는 JSON형식의 데이터 셋을 MongoDB에 먼저 덤프를 씌어준 후, 그대로 MySQL에 같은 데이터를 삽입한다.

INT 탐색 테스트를 수행하기 위해 추가로 1 ~ 10만 사이의 랜덤 숫자 25만 개를 넣어주었다.

INT 성능 비교

MySQL, MongoDB 둘 다 검색할 랜덤 숫자 1000개는 동일하다.앞으로 이 숫자를 기반으로 25만 개의 데이터를 검색해보았다. 랜덤 숫자는 약 10만 개 정도로 평균적으로 2,3 개 정도의 중복을 포함하고 있다.

MySQL - No Index

실행 코드

분석 결과

MongoDB - No Index

실행 코드

분석 결과

MySQL - Index

실행 코드

분석 결과

MongoDB - Index

실행 코드

분석 결과

분석 결과

DB

No Index 측정 시간

Index 측정 시간

성능 개선 비율

MySQL

418 sec

0.3123 sec

약 1,393 배

MongoDB

3117 sec

1.0126 sec

약 3,078 배

Index에 무관하게 MySQL이 일관되게 우수한 성능을 보여주었다.

STRING 동치 비교 분석

문자열 데이터의 경우, 각각의 DB에서 동치 연산 및 부분 문자열 연산이 존재하기 때문에 모두 테스트를 수행하였다. 동치 비교 분석은 해당 문자열에 대하여 Equal(==) 연산으로 탐색을 수행한 테스트이다.

MySQL - No Index

실행 코드

분석 결과

MongoDB - No Index

실행 코드

분석 결과

MySQL - Index

분석 결과

MySQL의 경우, Text Index를 적용시킬 때 인덱싱시킬 텍스트 값 길이를 반드시 명시해주어야 하기 때문에 해당 길이를 최대 700으로 제한하였다.

MongoDB - Index

분석 결과

분석 결과

DB

No Index 측정 시간

Index 측정 시간

성능 개선 비율

MySQL

18.1485 sec

0.0028 sec

약 9,000배

MongoDB

11.7807 sec

7.7963 sec

약 1.5배

MySQL이 압도적인 성능을 나타내는 것으로 보이나, MySQL은 최대 인덱스 길이를 700자 정도로 제한하였기 때문에, 전문에 인덱스를 적용시킨 유의미한 평가 지표라 판단하기 힘들다. 즉, 유효한 분석 결과는 No Index 측정 시간 뿐이다.

STRING 부분 연산

부분 연산을 수행하기 위해 각각의 데이터베이스에 Full Text Index를 적용시킨 후, 한글 및 영어에 빈도수가 다양하게 존재하는 단어 50개를 선정하였다.

부분 문자열 탐색을 수행하기 위하여, 다음과 같은 데이터 셋을 사용하였다.

MySQL - No Index

실행 코드

분석 결과

MongoDB - No Index

실행 코드

분석 결과

MySQL - Index

실행 코드

분석 결과

MongoDB - Index

실행 코드

분석 결과

분석 결과

DB

No Index 측정 시간

Index 측정 시간

성능 개선 비율

단어 소실

MySQL

1347sec

75sec

17.96배

발생

MongoDB

947sec

24sec

39.45배

발생

MongoDB가 MySQL에 비해 전반적으로 우수한 성능을 보여주었다. 그러나 양쪽 다 Full Tabel Scan에 비해 많은 양의 단어가 소실되었으며, 상대적으로 MongoDB에서 더 많은 소실량을 확인할 수 있다.

Array/Join 탐색

MongoDB의 Array 내의 연산 및 MySQL의 JOIN 연산의 성능을 비교한다. 해당 테스트의 경우 인덱스를 사용하지 않는다. 동일한 조건에 테스트를 수행하기 위해 아래와 같은 구문을 각 DBMS에서 수행하도록 한다.

"ㅁㅁㅁ"의 단어를 포함하면서(AND), "XXX" 혹은(OR) "XXXX"가 수정한 포스트를 찾아라

MySQL(JOIN)

post 테이블과 post_contributors의 테이블을 JOIN연산을 수행하였다.

실행 코드

실행 결과

MongoDB(Array)

MongoDB의 경우, Array 자료형으로 각 document마다 내장된 contributors 칼럼에 대하여 연산을 수행하였다.

실행 코드

실행 결과

분석 결과

DB

측정 시간

MySQL

9239sec

MongoDB

1670sec

MongoDB가 압도적인 성능을 보여주었다. 예전부터 존재했던 MySQL 내의 JOIN 성능 이슈를 감안하면 타당한 결과라고 생각된다.

결과 해석

여러가지 테스트 상황을 상정하여 고려해보았을 때, SOOJLE 서비스의 DBMS는 NoSQL - MongoDB로 채택하는 것이 이상적인 것으로 판단된다.

나무위키:데이터베이스 덤프
https://bit.ly/2P4YoEubit.ly