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_JOIN
과 JOIN_ORDER()
의 차이점과 실제 실무 적용 사례를 다뤄보겠습니다.
'IT > DataBase' 카테고리의 다른 글
STRAIGHT_JOIN과 JOIN_ORDER() 차이점 및 실무 적용 사례 (0) | 2025.06.22 |
---|---|
[MySQL] 컬럼 정보 수정하기 (1) | 2023.07.20 |
[MySQL] 데이터베이스, 테이블 정보 조회 (0) | 2023.07.19 |
[MySQL] SELECT 결과 INSERT 하기 (0) | 2023.07.18 |
[Oracle] 컬럼 추가, 수정, 삭제 (0) | 2017.12.06 |
댓글