본문 바로가기
IT/DataBase

STRAIGHT_JOIN과 JOIN_ORDER() 차이점 및 실무 적용 사례

by eddie_factory 2025. 6. 22.
반응형

복잡한 SQL 쿼리의 성능을 최적화할 때, 옵티마이저가 비효율적인 실행 계획을 세우는 경우가 종종 있습니다. 이를 제어하기 위해 사용하는 대표적인 힌트가 STRAIGHT_JOINJOIN_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_JOINJOIN_ORDER()를 적절히 선택해 실무에 적용해보시기 바랍니다.

반응형

댓글