본문 바로가기
IT/DataBase

MySQL 옵티마이저 힌트 제대로 사용하는 법

by eddie_factory 2025. 6. 20.
반응형

MySQL 8.0.2 버전 이상에서 가능합니다.


MySQL에서 쿼리 성능을 개선해야 할 때, 옵티마이저 힌트(Optimizer Hint)를 활용하면 실행 계획을 원하는 방향으로 유도할 수 있습니다. 이번 글에서는 힌트의 기본 문법부터 실무에서 자주 사용하는 예시까지 정리해보았습니다.

 

1. 옵티마이저 힌트란?

MySQL은 쿼리를 실행할 때 옵티마이저가 자동으로 최적의 실행 계획을 선택합니다. 하지만 때로는 예상과 다른 계획이 선택되어 성능이 저하될 수 있습니다. 이럴 때 힌트문을 사용하여 옵티마이저가 따를 실행 계획을 직접 지정할 수 있습니다.

힌트는 SQL 주석 안에 /*+ ... */ 형태로 작성합니다.

SELECT /*+ HINT */ ...
FROM ...

2. 자주 사용하는 힌트 종류

STRAIGHT_JOIN

조인의 순서를 강제로 고정합니다. 일반적으로 MySQL은 조인 순서를 자동 최적화하지만, 이 힌트를 사용하면 FROM 절에 적은 순서를 그대로 따릅니다.

SELECT STRAIGHT_JOIN *
FROM A
JOIN B ON A.id = B.a_id;

JOIN_ORDER()

MySQL 8.0부터 지원하는 힌트로, 명시적으로 조인 순서를 지정할 수 있습니다.

SELECT /*+ JOIN_ORDER(a b c) */ *
FROM a
JOIN b ON a.id = b.a_id
JOIN c ON b.id = c.b_id;

INDEX(), NO_INDEX()

특정 인덱스를 사용하도록 지정하거나, 사용하지 않도록 할 수 있습니다.

-- 특정 인덱스를 강제
SELECT /*+ INDEX(u idx_user_name) */ *
FROM user u
WHERE u.name = 'John';

-- 특정 인덱스를 사용하지 않도록 설정
SELECT /*+ NO_INDEX(u idx_user_age) */ *
FROM user u
WHERE u.age > 30;

MAX_EXECUTION_TIME()

쿼리 실행에 허용할 최대 시간을 제한할 수 있습니다. 단위는 밀리초(ms)입니다.

SELECT /*+ MAX_EXECUTION_TIME(1000) */ *
FROM large_table;

3. 힌트 여러 개 사용하기

여러 힌트를 함께 사용할 수 있습니다. 쉼표 없이 공백으로 나열합니다.

SELECT /*+ JOIN_ORDER(a b c) INDEX(a idx_a_id) */ *
FROM a
JOIN b ON ...
JOIN c ON ...;

4. 힌트 적용 확인 방법

힌트가 실제 적용되었는지는 EXPLAIN 명령어로 확인할 수 있습니다.

EXPLAIN SELECT /*+ JOIN_ORDER(a b c) */ ...

MySQL 8.0 이상에서는 EXPLAIN FORMAT=JSON을 활용하면 더 자세한 정보 확인이 가능합니다.

5. 실무 팁

  • 힌트는 실행 계획이 비효율적일 때만 사용하는 것이 좋습니다.
  • JOIN_ORDER()는 INNER/LEFT JOIN이 혼합된 복잡한 쿼리에서 유용합니다.
  • 힌트를 사용할 때는 EXPLAIN을 통해 항상 적용 여부와 효과를 검증해야 합니다.
  • 통계 정보나 데이터 양이 변하면 힌트의 효과도 달라질 수 있습니다.

마치며

MySQL 힌트문은 강력한 성능 튜닝 도구입니다. 자동 최적화가 항상 최선은 아니므로, 성능이 중요한 쿼리에 대해 힌트를 적절히 활용해 보시기 바랍니다. 다음 글에서는 STRAIGHT_JOINJOIN_ORDER()의 차이점과 실제 실무 적용 사례를 다뤄보겠습니다.

반응형

댓글