본문 바로가기

DataBase

[DataBase] MySQL vs Oracle

728x90

스프링으로 서버를 구축하며 모든 프로젝트에는 DB를 사용했습니다.

 

아무런 고민없이 H2, Mysql 같은 DB들을 사용하였는데 <Real Mysql>을 공부하며 Oracle에 대한 내용을 접했을 때, 왜 Oracle을 이제까지 사용해보지 않았는지 의문이 들었습니다.

 

따라서 <Real Mysql>을 제대로 공부하기 전, Mysql과 많이 비교되는 Oracle에 대해서 비교해보는 포스팅을 작성하겠습니다.

 


비용

  • MySQL
    • MySQL은 기본적으로 오픈소스 라이선스이기 때문에 무료입니다.  따라서 보통 중소규모의 프로젝트에 사용됩니다.
    • MySQL은 차지하는 용량도 정말 적기때문에 비용면에서 크게 이득입니다. 1MB 메모리 환경에서도 데이터베이스를 운영할 수 있을만큼 오버해드가 작습니다.
  • Oracle
    • "페이스북이 가진 데이터를 모두 오라클 RDBMS에 저장하면 페이스북은 망할 것이다." 라는 말이 나올정도로 비쌉니다.
    • 메모리 사용율이 크기에 많은 용량이 확보되어야 설치가 가능합니다.

대규모 트래픽 및 기능

  • MySQL
    •  MySQL 또한 충분한 확장성을 제공하긴 하지만, 기본적으로 대규모의 트래픽을 처리하기 위해선 인덱싱, 분산 데이터베이스, 캐싱 등의 도움이 필요합니다.
    • 복잡한 쿼리는 성능이 저하됩니다.
  • Oracle
    •  Oracle은 기본적으로 수천개의 동시 사용자 및 대규모 데이터처리를 지원할 수 있습니다. 이는 Oracle이 다중 CPU 및 다중 서버 아키텍처를 지원하고, 데이터베이스 파티셔닝, 클러스터링, 병렬처리등의 기능을 제공하기 때문입니다.

구조

기본적으로 실제 서비스에 도입하면 둘다 장애예방효과 또는 장애발생 시 가용성을 기대하며 다중화구조를 구축합니다.

  • MySQL
    • DB 서버마다 독립적으로 스토리지를 할당합니다. 
    • 독립적인 스토리지 할당에 기반을 두는만큼 이중화를 위한 클러스터나 복제 구성으로 운영합니다.
    • 따라서 MySQL DB 서버에 접속하더라도 동일한 SQL으로 같은 결과가 나오지 않을 수 있으며, DB 서버마다 각자의 역할이 부여될 수 있습니다.
    • 쿼리문이 수행되는 서버의 위치를 파악하는것이 중요합니다. 그의 예시로 쿼리 오프로딩을 적용하여 쓰기는 마스터, 읽기는 스레이브 노드에서 수행한다했을 때, 마스터에서 SELECT 문의 튜닝을 하거나 슬레이브에서 UPDATE, DELETE, INSERT 의 튜닝을 하게된다면 정상적으로 튜닝이 되지않게됩니다.
  • Oracle
    • DB 서버 스토리지 하나를 공유합니다. 따라서 어느 DB 서버에 접속하여 SQL문을 수행하더라도 같은 결과를 출력합니다.

지원 기능

Join 알고리즘의 기능에 차이가 있습니다.

  • MySQL
    • 대부분 중첩루프조인 방식으로 조인을 수행합니다.
    • 스토리지 엔진이 있기에 오픈소스 DBMS를 바로 꽂아 사용할 수 있으므로 확장성이 좋습니다. (필요한 DBMS를 설정해 사용할 수 있습니다.)
  • Oracle
    • 중첩루프조인 뿐만아니라 정렬병합조인과 해시조인방식도 제공합니다.

SQL 구문

  • Null 대체 : 특정 열에 Null 값이 포함될 수 있으므로 Null 대신 주로 'N/A' 라는 문자열로 대체합니다. 
    • MySQL : IFNULL(열명, '대쳇값')
    • Oracle : NVL(열명, '대쳇값')
  • 페이징 처리 : 데이터를 불러올 때 일부 분량만 제한적으로 가져올 때 사용합니다. 각각 LIMIT, ROWNUM 키워드를 사용합니다.
    • MySQL : LIMIT 숫자
    • Oracle : ROWNUM <= 숫자
  • 현재날짜 : 현재 시스템 날짜를 조회합니다. (MYSQL도 SYSDATE 사용가능)
    • MySQL : NOW()
    • Oracle : SYSDATE
  • 조건문 : 특정 조건을 만족할 때와 않을때 수행할 방향을 정해주는 구문입니다. (Oracle 도 CASE-WHEN-THEN 사용가능)
    • MySQL : IF(조건식, '참값', '거짓값')
    • Oracle : DECODE(열명, 값, '참값', '거짓값')
  • 날짜 형식 : 날짜 데이터를 원하는 형식으로 변경할 수 있습니다. 
    • MySQL : DATE_DORMAT(날짜열, '형식')
    • Oracle : TO_CHAR(날짜열, '형식')
  • 자동 증갓값 : 데이터가 지속적으로 생성될 때 자동으로 순번을 매기는 값입니다. 
    • MySQL : AUTO_INCREMENT
    • Oracle : CREATE SEQUENCE 문으로 시퀀스 오브젝트 생성 뒤, SELECT 시퀀스명.nextval FROM dual 구문사용.
  • 문자결합 : 여러개의 문자를 하나로 결합합니다.
    • MySQL : CONCAT(열값 또는 문자열, 열값 또는 문자열)
    • Oracle : 열값 또는 문자열 || 열값 또는 문자열 혹은 CONCAT(열값 또는 문자열, 열값 또는 문자열)
  • 문자추출 : 문자열의 특정 구간을 추출합니다.
    • MySQL : SUBSTRING(열값 또는 문자열, 시작위치, 추출하려는 문자 개수)
    • Oracle : SUBSTR(열값 또는 문자열, 시작위치, 추출하려는 문자 개수)

쿼리튜닝의 중요성

MySQL은 대다수가 중첩루프조인 알고리즘으로 수행되고, 쿼리 결과가 메모리에 적재되는 캐시기능에 한계가 있으므로 일반적인 쿼리 작성 및 튜닝이 통하지 않을 수 있습니다. 

 

중첩루프조인

NESTED LOOP JOIN이라고 불리는 이 방식은 2개이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대의 ROW를 결합하여 원하는 결과를 조합하는 조인방식입니다. 

해당 방식은 조인해야 할 데이터가 많지않은 경우에 효율적으로 사용됩니다. 

 

조인 방식

드라이빙 테이블로 한 테이블을 선정하고, 해당 테이블로부터 where 절에 정의된 검색 조건을 만족하는 데이터들을 걸러낸 후, 걸러낸 값을 가지고 조인대상 테이블을 순차적으로 검색하며 결과값을 얻어냅니다.

 

드라이빙 테이블

Join을 할 때 먼저 엑세스되어 ACCESS PATH를 주도하는 테이블입니다. 조인을 할 때 먼저 엑세스 되는 테이블을 드라이빙 테이블이라고하고, 나중에 엑세스되는 테이블을 드리븐 테이블이라고합니다.

 


● 참고자료 : 업무에 바로 쓰는 SQL 튜닝 (양바른 | 한빛미디어)

728x90

'DataBase' 카테고리의 다른 글

[DataBase] DBCP  (0) 2024.04.11
[DataBase] DBMS 기본 용어  (0) 2023.08.02
[DataBase] 사용자  (0) 2023.07.19
[DataBase] MySQL 시스템 변수  (0) 2023.07.18
[DataBase] Select 쿼리 실행순서  (0) 2023.07.06