MySQL
- MySQL은 1995년 오픈소스로 배포된 관계형 데이터베이스 관리 시스템으로, 대용량 데이터와 가용성, 안정성을 제공한다.
- 다중 스레드, 다중 사용자 형식의 구조질의어 형식의 데이터베이스 관리 시스템으로, 2010년 오라클에 인수되었다.
- 현재 MySQL8.0 버전까지 배포되었으며 상용 버전과 커뮤니티 버전으로 구분한다.
- 상용 버전은 오라클에서 다양한 보안 패치와 개선된 기능을 제공하지만, GPL 라이선스를 사용하는 무료 버전은 제약된 기능과 서비스만 사용할 수 있다.
MariaDB
- MySQL이 오라클로 인수되고 나서 개발 지침과 라이선스 정책의 변화에 따라, MySQL의 핵심 개발자 주도로 오픈소스 정책을 지향하는 MariaDB가 탄생했다.
- MariaDB는 MySQL 소스코드를 기반으로 개발되어 일부 기능과 수행 메커니즘, 시스템 변수와 시스템 상태를 제외하고는 MySQL과 거의 차이가 없다.
버전
- MySQL과 MariaDB 모두 초반에 5.x 버전으로 같은 길을 걸어왔으나, 5.5 버전부터 MariaDB가 독자적인 길을 선택하면서 분기했다.
- MySQL: 5.x → 5.5 → 8.0
- MariaDB: 5.x → 10.0 → 10.5
- 버전에 따른 기능 차이가 존재하지만 SQL문의 문법이나 실행 계획의 출력 방식은 유사하므로 버전과 관계없이 개발자들은 SQL문을 개발할 수 있다.
- 단, 버전에 따라 DB 엔진 레벨에서 제공하는 옵티마이저 기능의 차이는 존재하기 때문에, 설치된 DB 버전에 따라 최적화 기능을 선택적으로 활용할 수 있다.
상용 RDBMS와의 차이점
구조적 차이
- 오라클과 MySQL(MariaDB 포함)을 실제 서비스에 도입할 때는 장애 예방 효과 또는 장애 발생 시 가용성을 위해 이중화 구조로 구축하는데, 기본적으로 데이터가 저장되는 스토리지의 구조 측면에서 큰 차이를 보인다.
- 오라클은 통합된 스토리지 하나를 공유하여 사용하는 방식이지만, MySQL은 물리적인 DB 서버마다 독립적으로 스토리지를 할당하여 구성한다.
- 오라클은 공유 스토리지를 사용하므로 사용자가 어느 DB 서버에서 접속하여 SQL문을 수행하더라도 같은 결과를 출력하며, 동일한 구문(SELECT, INSERT, DELETE, UPDATE)을 처리할 수 있다.
- 반면에 MySQL은 독립적인 스토리지 할당을 기반으로, 마스터-슬레이브 구조가 대부분이다.
- 이때 마스터 노드는 쓰기/읽기 처리를 모두 수행할 수 있고 슬레이브 노드는 읽기 처리만 수행할 수 있다.
- 따라서 물리적으로 여러 대의 MySQL 서버에 접속하더라도 동일한 구문(SELECT, DELETE, UPDATE)이 처리되지 않을 수 있으며, DB 서버마다 각자의 역할이 부여될 수 있다.
※ 쿼리 오프로딩: DB 서버의 트랜잭션에서 쓰기 트랜잭션과 읽기 트랜잭션을 분리하여 DB 처리량을 증가시키는 성능 향상 기법
지원 기능 차이
- MySQL은 대부분 중첩 루프 조인 방식으로 조인을 수행하지만, 오라클에서는 중첩 루프 조인 방식뿐만 아니라 정렬 병합 조인과 해시 조인 방식도 제공한다.
- 특히 MySQL은 오라클과 달리 데이터를 저장하는 스토리지 엔진이라는 개념을 포함하므로, 오픈소스 DBMS를 바로 꽂아서 사용할 수 있는 확장성을 제공한다.
- 또한 MySQL은 오라클 대비 메모리 사용률이 상대적으로 낮아서 사양이 낮은 컴퓨팅 환경에서도 설치하여 서비스할 수 있다.
SQL 구문 차이
Null 대체
MySQL/MariaDB
IFNULL(칼럼명, '대체값')
오라클
NVL(칼럼명, '대체값')
페이징 처리
MySQL/MariaDB
LIMIT 숫자
오라클
ROWNUM <= 숫자
현재 날짜
MySQL/MariaDB
NOW()
오라클
SYSDATE
※ 참고
MySQL은 FROM 절 없이 SELECT 문만으로도 현재 날짜를 출력할 수 있지만, 오라클은 가상 테이블인 dual을 명시해야 현재 날짜를 출력할 수 있다.
조건문
MySQL/MariaDB
IF (조건식, '참값', '거짓값')
오라클
DECODE(칼럼명, '값', '참값', '거짓값')
날짜 형식
MySQL/MariaDB
DATE_FORMAT(날짜열, '형식')
오라클
TO_CHAR(날짜열, '형식')
AUTO_INCREASE
- 신규 데이터가 지속적으로 생성될 때 증가하는 순번을 자동으로 매기는 숫자형 값, 즉 자동 증가값을 저장할 수 있다.
- 즉, 이미 저장된 다른 데이터와 값이 중복되지 않도록 기존에 저장된 순번보다 더 큰 숫자를 생성하여 데이터를 저장하는 방식
- 오라클에서는 각각 시퀀스라는 오브젝트를 활용하는데, 먼저 CREATE SEQUENCE 문으로 시퀀스 오브젝트를 생성한 뒤, SELECT 시퀀스명.nextval FROM dual; 구문으로 신규 데이터의 시퀀스 숫자를 가져온다.
CREATE SEQUENCE [시퀀스명]
INCREMENT BY [증감숫자]
START WITH [시작숫자]
NOMINVALUE OR MINVALUE [최솟값]
NOMAXVALUE OR MAXVALUE [최댓값]
CYCLE OR NOCYCLE
CACHE OR NOCACHE
- MySQL(MariaDB 포함)에서는 특정 열의 속성으로 자동 증가하는 값을 설정하는 auto_increment를 명시하여, 테이블마다 특정한 하나의 열에만 해당 속성을 정의하여 자동 증가하는 숫자를 저장한다.
- MariaDB 10.3 이상에서는 오라클과 마찬가지로 CREATE SEQUENCE 문으로 시퀀스를 생성한 뒤 SELECT nextval(시퀀스명); 구문으로 신규 순번을 매길 수 있다.
문자 결합
MySQL/MariaDB/오라클
CONCAT(문자열, 문자열)
오라클
문자열 || 문자열
문자 추출
MySQL/MariaDB
SUBSTRING(문자열, 시작 위치, 추출하려는 문자 개수)
오라클
SUBSTR(문자열, 시작 위치, 추출하려는 문자 개수)
'Computer Science > Database' 카테고리의 다른 글
`이상현상과 정규화 (0) | 2022.02.22 |
---|---|
JOIN의 종류 (0) | 2022.02.19 |
`서브쿼리와 뷰 (0) | 2022.02.19 |
테이블과 키 (0) | 2022.02.19 |
`DB 엔진과 SQL 수행 프로세스 (0) | 2022.02.19 |