
(RealMySQL의 3챕터 아키텍처를 가져왔다. 해당 아키텍처는 볼 때마다 훌륭하다.)
SQL을 가장 효율적으로 실행하기 위해 실행 계획을 세우는 DBMS 내부 엔진이다.
쉽게 말하면, SELECT ... 같은 SQL을 날린다면, DB가 "어떤 인덱스를 탈까? 풀스캔 할까? 어떤 순서로 조인하지?"를 자동으로 계산해서 실행 계획을 만들어주는 "두뇌"라고 보면 된다.
이러한 사항들을 고려해서 가장 빨리 끝날 확률이 높은 실행계획을 고른다.
SELECT *
FROM orders
WHERE customer_id = 10;
옵션 1 : 테이블 전체 스캔 (FullTableScan) -> 행이 수십 개면 이게 더 빠름 무조건 빠름.
옵션 2 : 인덱스 스캔(Index Scan) -> 행이 늘어날수록 이게 더 빠름.
customer_id 인덱스 있다면 이게 훠~~얼씬 빠름.
즉, 옵티마이저는 통계 정보를 보고 자동으로 더 효율적인 것을 고른다.
EXPLAIN in MySQL, EXPLAIN PLAN in Oracle)특징
STRAIGHT_JOIN, FORCE INDEX, USE INDEX 등)장단점
실행계획 확인
EXPLAIN SELECT ...;
EXPLAIN ANALYZE SELECT ...; -- MySQL 8.0부터 실행 시간까지 확인 가능
특징
- 고도화된 CBO (Cost-Based Optimizer)
- 매우 정교한 통계 정보 기반 → 테이블, 컬럼, 인덱스, 파티션 등 상세 관리
- 실행계획 캐싱(O) → 같은 SQL은 재사용 (Library Cache)
- 다양한 옵티마이저 힌트 제공 (INDEX, FULL, PARALLEL, LEADING, USE_NL, USE_HASH 등 수백 개)
장단점
- 장점: 복잡한 쿼리/대규모 데이터에서 최적화 탁월
- 단점: 옵티마이저 동작이 무겁고, 통계 관리 비용이 큼 (ANALYZE, DBMS_STATS 필요)
실행계획 확인
EXPLAIN PLAN FOR SELECT ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
| 항목 | MySQL | Oracle |
|---|---|---|
| 옵티마이저 방식 | CBO (단순) | CBO (고도화) |
| 통계 활용 | 제한적 (대략적) | 정교함 (컬럼/인덱스/히스토그램 기반) |
| 실행계획 캐싱 | X (매번 새로 수립) | O (Library Cache 재사용) |
| 힌트 지원 | 제한적 (USE INDEX, STRAIGHT_JOIN) | 매우 다양 (INDEX, FULL, USE_HASH, ...) |
| 성능 튜닝 난이도 | 단순 | 고급 (풍부한 기능, 하지만 복잡함) |
| 적합한 환경 | 중소규모, 웹서비스, OLTP 중심 | 대규모 트랜잭션/분석, OLTP + OLAP 병행 |
EXPLAIN 확인 후 인덱스 설계/힌트로 조정해야 함. 👉 결론