반응형
복잡한 SQL 쿼리의 성능을 최적화할 때, 옵티마이저가 비효율적인 실행 계획을 세우는 경우가 종종 있습니다. 이를 제어하기 위해 사용하는 대표적인 힌트가 STRAIGHT_JOIN과 JOIN_ORDER()입니다. 이 두 힌트는 조인의 순서를 지정하는 역할을 하지만, 동작 방식과 활용 시점에서 중요한 차이가 있습니다.
이번 글에서는 두 힌트의 차이점과 실무에서의 적용 사례를 함께 알아보겠습니다.
1. STRAIGHT_JOIN 이란?
STRAIGHT_JOIN은 MySQL에서 INNER JOIN처럼 사용할 수 있는 키워드이며, 조인 순서를 FROM 절에 작성한 순서 그대로 강제합니다.
SELECT STRAIGHT_JOIN *
FROM table_a
JOIN table_b ON table_a.id = table_b.a_id
JOIN table_c ON table_b.id = table_c.b_id;
- MySQL 옵티마이저는 기본적으로 가장 효율적인 조인 순서를 자동으로 선택하지만,
STRAIGHT_JOIN을 사용하면 사용자가 지정한 순서를 무조건 따릅니다. - MySQL 5.7, 8.0 모두 지원됩니다.
- JOIN 키워드 대체용으로 사용됩니다.
2. JOIN_ORDER() 이란?
JOIN_ORDER()는 MySQL 8.0 이상에서 도입된 옵티마이저 힌트이며, 옵티마이저 힌트 문법(/*+ */) 안에 작성해야 합니다. 이 역시 조인 순서를 지정하지만, 힌트로만 작동합니다.
SELECT /*+ JOIN_ORDER(a b c) */ *
FROM table_a a
JOIN table_b b ON a.id = b.a_id
JOIN table_c c ON b.id = c.b_id;
STRAIGHT_JOIN과 달리 JOIN 자체는 변경하지 않고, 힌트를 통해 순서만 제안합니다.- 단순
INNER JOIN,LEFT JOIN,RIGHT JOIN모두에서 활용 가능합니다. - MySQL 8.0 이상에서만 지원됩니다.
- 더 유연한 힌트 기반 제어가 가능합니다.
3. 주요 차이점 정리
| 구분 | STRAIGHT_JOIN | JOIN_ORDER() |
|---|---|---|
| 사용 위치 | JOIN 키워드로 직접 사용 |
/*+ */ 힌트 주석 내부 |
| 지원 버전 | MySQL 5.7 이상 | MySQL 8.0 이상 |
| 적용 방식 | FROM 순서 고정 | 명시한 조인 순서로 유도 |
| 사용 형태 | JOIN 키워드 대체 | 옵티마이저 힌트 구문 |
| LEFT JOIN 지원 | 제한적 | 가능 |
| 가독성 | 낮음 (JOIN 체인이 길어지면) | 상대적으로 높음 |
4. 실무 적용 사례
📌 사례 1: STRAIGHT_JOIN으로 옵티마이저 튜닝
SELECT STRAIGHT_JOIN a.*, b.*
FROM log_table a
JOIN user_table b ON a.user_id = b.id
WHERE a.created_at > NOW() - INTERVAL 1 DAY;
- 옵티마이저는
user_table을 먼저 읽으려고 시도했지만,log_table이 훨씬 작고 최근 데이터 위주로 빠르게 필터링 가능했기 때문에STRAIGHT_JOIN을 사용하여 순서를 고정해 성능 향상을 얻었습니다.
📌 사례 2: JOIN_ORDER()로 복잡한 조인 순서 고정
SELECT /*+ JOIN_ORDER(t1 t2 t3 t4) */ *
FROM t1
JOIN t2 ON ...
JOIN t3 ON ...
JOIN t4 ON ...;
- 옵티마이저가
t3 → t1 → t2 → t4순서로 실행 계획을 세우며 큰 지연이 발생 JOIN_ORDER()를 통해t1 → t2 → t3 → t4순서를 지정한 후, 성능이 3배 이상 개선됨- 특히
LEFT JOIN,OUTER JOIN과 조합될 때STRAIGHT_JOIN보다 안전하게 사용 가능
5. 어떤 힌트를 선택할까?
- MySQL 5.7 이하를 지원해야 한다면:
STRAIGHT_JOIN만 사용 가능 - MySQL 8.0 이상이고 JOIN 구조가 복잡하다면:
JOIN_ORDER()가 더 명확하고 유연함 - LEFT JOIN이 섞여 있다면:
JOIN_ORDER()가 더 적합 - JOIN 키워드 자체를 대체하고 싶다면:
STRAIGHT_JOIN
마치며
쿼리 최적화는 단순히 인덱스를 추가하는 것만으로는 해결되지 않는 경우가 많습니다. 특히 옵티마이저의 실행 계획이 예상과 다를 때는, 조인 순서를 직접 제어하는 것이 큰 차이를 만들 수 있습니다. STRAIGHT_JOIN과 JOIN_ORDER()를 적절히 선택해 실무에 적용해보시기 바랍니다.
반응형
'IT > DataBase' 카테고리의 다른 글
| MySQL 옵티마이저 힌트 제대로 사용하는 법 (0) | 2025.06.20 |
|---|---|
| [MySQL] 컬럼 정보 수정하기 (1) | 2023.07.20 |
| [MySQL] 데이터베이스, 테이블 정보 조회 (0) | 2023.07.19 |
| [MySQL] SELECT 결과 INSERT 하기 (0) | 2023.07.18 |
| [Oracle] 컬럼 추가, 수정, 삭제 (0) | 2017.12.06 |
댓글