FeGwan-Training / FeGwan

0 stars 0 forks source link

㏈ 업무에 바로 쓰는 SQL 튜닝 1장 MySQL과 MariaDB 개요 #68

Open MyeoungDev opened 9 months ago

MyeoungDev commented 9 months ago

Discussed in https://github.com/FeGwan-Training/FeGwan/discussions/67

Originally posted by **MyeoungDev** January 26, 2024

1장 MySQL과 MariaDB 개요

오라클과 MySQL비교(MariaDB 포함)

### MySQL(MariaDB) - 스토리지 구조 - 물리적인 DB 서버마다 독립적으로 스토리지를 할당(Shared Nothing) - 이중화구조 마스터-슬레이브구조가 대부분. - 물리적으로 여러대의 DB서버에 접속하더라도 동일한 구문이 처리되지 않을 수 있으며, DB 서버 마다 각자의 역할이 부여될 수 있다. - 조인 알고리즘 - 대부분 중첩 루프 조인(Nested Loop Join) - 최근 8.0.18 버전 부터 제약적으로 해쉬 조인 제공 - 메모리 사용률 - 사양이 낮은 컴퓨터 환경에서 사용 가능. - 약 1MB 메모리 환경에서도 사용 가능. - 오버헤드 작음. ### Oracle - 스토리지 구조 - 통합된 스토리지 하나를 공유(Shared Everything)하여 사용 - 공유 스토리지를 사용하므로 어느 DB 서버에 접속하여 SQL문을 수행하더라도 같은 결과를 출력 & 처리 - 조인 알고리즘 - 중첩 루프 조인(Nested Loop Join), 정렬 병합 조인(Sort Merge Join), 해쉬 조인(Hash Join) - 메모리 사용률 - 비교적 높은 사양 수백MB의 메모리 사용량이 필요.

이중화구조 마스터-슬레이브구조가 대부분. 물리적으로 여러대의 DB서버에 접속하더라도 동일한 구문이 처리되지 않을 수 있으며, DB 서버 마다 각자의 역할이 부여될 수 있다. | 통합된 스토리지 하나를 공유(Shared Everything)하여 사용

공유 스토리지를 사용하므로 어느 DB 서버에 접속하여 SQL문을 수행하더라도 같은 결과를 출력 & 처리 | | 조인 알고리즘 | 대부분 중첩 루프 조인(Nested Loop Join) 최근 8.0.18 버전 부터 제약적으로 해쉬 조인 제공 | 중첩 루프 조인(Nested Loop Join), 정렬 병합 조인(Sort Merge Join), 해쉬 조인(Hash Join) | | 메모리 사용률 | 사양이 낮은 컴퓨터 환경에서 사용 가능 약 1MB 메모리 환경에서도 사용 가능. 오버헤드 작음. | 비교적 높은 사양 수백MB의 메모리 사용량이 필요. |

이중화구조 마스터-슬레이브구조가 대부분. 물리적으로 여러대의 DB서버에 접속하더라도 동일한 구문이 처리되지 않을 수 있으며, DB 서버 마다 각자의 역할이 부여될 수 있다. | 통합된 스토리지 하나를 공유(Shared Everything)하여 사용

공유 스토리지를 사용하므로 어느 DB 서버에 접속하여 SQL문을 수행하더라도 같은 결과를 출력 & 처리 | | 조인 알고리즘 | 대부분 중첩 루프 조인(Nested Loop Join) 최근 8.0.18 버전 부터 제약적으로 해쉬 조인 제공 | 중첩 루프 조인(Nested Loop Join), 정렬 병합 조인(Sort Merge Join), 해쉬 조인(Hash Join) | | 메모리 사용률 | 사양이 낮은 컴퓨터 환경에서 사용 가능 약 1MB 메모리 환경에서도 사용 가능. 오버헤드 작음. | 비교적 높은 사양 수백MB의 메모리 사용량이 필요. |

구문 차이

Null 대체

-- MySQL
IFNULL(COLUMN_NAME, '대체값')

-- Oracle
NVL(COLUMN_NAME, 'N/A')

페이징 처리

-- MySQL
LIMIT 숫자

-- Oracle
ROWNUM <= 숫자

현재 날짜

-- MySQL
NOW()

-- Oracle
SYSDATE

조건문

-- MySQL
IF (조건식, '참값', '거짓값')

-- Oracle
DECODE(COLUMN_NAME, '값', '참값', '거짓값')

-- 공통
CASE
    WHEN 조건식
    THEN 결과값
    ...
END

날짜 형식

-- MySQL
DATE_FORMAT(날짜 Column, '%Y-%m-%d %H%i%s')

-- Oracle
TO_CHAR(날짜 Column, 'YYYYMMDD HH24MISS')

자동 증갓값

오라클의 경우 Sequence 라는 Object를 활용한다.

먼저 CREATE SEQUENCE 문으로 시퀀스 오브젝트를 생성한 뒤, 해당 시퀀스명으로 함수를 호출하여 신규 숫자를채번하는 방식이다.

이때 SELECT 시퀀스명.nextval FROM dual 구문으로 신규 데이터의 시퀀스 숫자를 가져온다.

-- MySQL
AUTO_INCREMENT

CREATE TABLE(
    seq INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(20) NOT NULL
)
-- Oracle
CREATE SEQUENCE [시퀀스명]
INCREMENT BY [증감숫자]
START WITH [시작숫자]
NOMINVALUE OR MINVALUE [최솟값]
NOMAXVALUE OR MAXVALUE [최댓값]
CYCLE OR NOCYCLE
CACHE OR NOCACHE

CREATE SEQUENCE ORACLE_SEQ_SAMPLE
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 999999999
CYCLE
CACHE;

-- 다음 값 채번 문법
SELECT 시퀀스명.NEXTVAL FROM dual;

SELECT ORACLE_SEQ_SAMPLE.NEXTVAL FROM DUAL;

문자 결합

-- MySQL
CONCAT(열값 또는 문자열, 열값 또는 문자열)

-- Oracle
1. 열값 또는 문자열 || 열값 또는 문자열
2. CONCAT(열값 또는 문자열, 열값 또는 문자열)

문자 추출

-- MySQL
SUBSTRING(열값 또는 문자열, 시작 위치, 추출하려는 문자 개수)

-- Oracle
SUBSTR(열값 또는 문자열, 시작 위치, 추출하려는 문자 개수)