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;-- JOINSELECT u.name, o.totalFROM users uINNER JOIN orders o ON u.id = o.user_idWHERE 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가 복제하는 구조. 읽기 부하 분산과 고가용성에 사용된다.
-- 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=FEDERATEDCONNECTION='mysql://user:password@remote-host:3306/dbname/users';
특징 및 제한
항목
내용
트랜잭션
미지원
인덱스
로컬 인덱스 없음, 원격 인덱스 사용
ALTER TABLE
로컬 정의만 변경 (원격 테이블 불변)
성능
네트워크 지연에 의존, 대량 조회 부적합
용도
이기종 DB 간 단순 조회 연동
프로덕션에서는 잘 쓰이지 않음. 복잡한 연동은 애플리케이션 레이어나 ETL 파이프라인 권장.