Tan Kim

MySQL

오픈소스 관계형 데이터베이스. 웹 서비스에서 가장 널리 쓰이는 RDBMS 중 하나.

자주 쓰는 쿼리

조회

SELECT * FROM users WHERE id = 1;
SELECT id, name FROM users ORDER BY created_at DESC LIMIT 10;
 
-- 집계
SELECT status, COUNT(*) AS cnt FROM orders GROUP BY status;
 
-- JOIN
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.status = 'paid';

삽입 / 수정 / 삭제

INSERT INTO users (name, email) VALUES ('김탄', 'test@example.com');
 
-- 중복 시 업데이트
INSERT INTO users (id, name) VALUES (1, '김탄')
ON DUPLICATE KEY UPDATE name = VALUES(name);
 
UPDATE users SET name = '이름변경' WHERE id = 1;
 
DELETE FROM users WHERE id = 1;

테이블 관리

-- 생성
CREATE TABLE users (
  id       BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  name     VARCHAR(100)    NOT NULL,
  email    VARCHAR(255)    NOT NULL UNIQUE,
  created_at DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP
);
 
-- 컬럼 추가
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
 
-- 인덱스 추가
CREATE INDEX idx_email ON users (email);
 
-- 테이블 삭제
DROP TABLE IF EXISTS users;

인덱스

종류 설명
PRIMARY KEY 클러스터드 인덱스, 행 식별자
UNIQUE 중복 불허
INDEX 일반 인덱스, 조회 성능 향상
FULLTEXT 텍스트 전체 검색
복합 인덱스 여러 컬럼 조합, 순서가 중요
-- 실행 계획 확인 (인덱스 사용 여부)
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

트랜잭션

START TRANSACTION;
 
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
 
COMMIT;    -- 성공 시
ROLLBACK;  -- 실패 시

격리 수준

수준 Dirty Read Non-Repeatable Read Phantom Read
READ UNCOMMITTED O O O
READ COMMITTED X O O
REPEATABLE READ X X O (MySQL 기본값)
SERIALIZABLE X X X

자주 쓰는 함수

함수 설명
NOW() 현재 날짜시간
DATE_FORMAT(dt, '%Y-%m-%d') 날짜 포맷
DATEDIFF(a, b) 날짜 차이 (일)
IFNULL(val, default) NULL 대체
COALESCE(a, b, c) 첫 번째 non-NULL 반환
CONCAT(a, b) 문자열 연결
JSON_EXTRACT(col, '$.key') JSON 컬럼 접근

Replication (Master / Slave)

Master에서 발생한 변경사항을 Slave가 복제하는 구조. 읽기 부하 분산과 고가용성에 사용된다.

Write → Master (binlog 기록)
              ↓ (binlog 전송)
Read  → Slave (relay log 적용)

동작 방식

  1. Master가 변경사항을 binlog에 기록
  2. Slave의 I/O 스레드가 binlog를 읽어 relay log에 저장
  3. Slave의 SQL 스레드가 relay log를 재실행

복제 모드

모드 설명 특징
비동기 Master는 Slave 완료를 기다리지 않음 기본값, 빠름, 데이터 손실 가능
반동기 최소 1개 Slave 수신 확인 후 커밋 안전, 약간 느림
동기 모든 Slave 완료 후 커밋 가장 안전, 느림 (Galera Cluster 등)

주요 명령어

-- Master 상태 확인
SHOW MASTER STATUS;
 
-- Slave 상태 확인
SHOW SLAVE STATUS\G
 
-- Slave 시작 / 중지
START SLAVE;
STOP SLAVE;

주의사항

  • Slave는 기본적으로 읽기 전용 (read_only = 1) 으로 설정
  • 비동기 복제는 Master 장애 시 일부 데이터 유실 가능 (replication lag)
  • MySQL 8.0+에서는 SLAVE 대신 REPLICA 용어 사용 (SHOW REPLICA STATUS)

FEDERATED 엔진

원격 MySQL 서버의 테이블을 로컬 테이블처럼 조회할 수 있는 스토리지 엔진. 데이터는 원격 서버에 저장된다.

로컬 서버 (FEDERATED 테이블)
        ↕ MySQL 프로토콜
원격 서버 (실제 데이터)

활성화

# my.cnf
[mysqld]
federated
-- 활성화 확인
SHOW ENGINES;

테이블 생성

CREATE TABLE remote_users (
  id    BIGINT UNSIGNED NOT NULL,
  name  VARCHAR(100)    NOT NULL,
  email VARCHAR(255)    NOT NULL
) ENGINE=FEDERATED
CONNECTION='mysql://user:password@remote-host:3306/dbname/users';

특징 및 제한

항목 내용
트랜잭션 미지원
인덱스 로컬 인덱스 없음, 원격 인덱스 사용
ALTER TABLE 로컬 정의만 변경 (원격 테이블 불변)
성능 네트워크 지연에 의존, 대량 조회 부적합
용도 이기종 DB 간 단순 조회 연동

프로덕션에서는 잘 쓰이지 않음. 복잡한 연동은 애플리케이션 레이어나 ETL 파이프라인 권장.

메모