ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 9장 - 옵티마이저와 힌트 - 3편
    CS/Real MySQL 8.0 요약 2024. 1. 9. 00:01

    쿼리 힌트

    쿼리 힌트는 옵티마이저에게 쿼리의 실행 계획을 어떻게 수립해야 할지 힌트를 제공하는 데 사용됩니다.

     

    쿼리 힌트가 필요한 이유?

    옵티마이저가 실행 계획을 수립해주는데 쿼리 힌트가 왜 필요할까요?

    옵티마이저가 우리의 서비스를 100% 이해하지 못하기 때문에 때로는 DBA나 개발자가 부족한 실행 계획을 수립할 때가 있을 수 있습니다.

     

     

    쿼리 힌트의 종류

    • 인덱스 힌트 (STRAIGHT_JOIN)
    • 옵티마이저 힌트

     

    인덱스 힌트

     

    인덱스 힌트는 SELECT 명령과 UPDATE 명령에서만 사용할 수 있습니다.

    STRAIGHT_JOIN은 여러 개의 테이블이 조인되는 경우 FROM 절에 명시된 순서대로 조인 순서를 고정하는 역할을 합니다.

    일부 테이블의 순서에 대해서는 제안하는 힌트들도 있습니다.

     

    USE INDEX, FORCE INDEX, IGNORE INDEX를 활용하여 특정 인덱스를 사용하도록 힌트를 줄 수 있습니다.

    3~4개 이상의 칼럼을 포함하는 비슷한 인덱스가 여러 개 존재하면 옵티마이저가 가끔 실수합니다.

     

     

    주의할 점

    인덱스의 사용법이나 좋은 실행 계획이 어떤 것인지 판단하기 힘든 상황이라면 힌트를 사용해 강제로 옵티마이저의 실행 계획에 영향을 미치는 것이 피하는 것이 좋습니다.

     

    최적의 실행 계획은 데이터의 성격에 따라 매시간 변하므로, 지금 특정 인덱스를 활용하는 게 좋을지라도 내일은 특정 인덱스를 활용하지 않는 것이 최선일 수 있습니다.

     

    대게 옵티마이저가 실시간 통계 정보를 가지고 선택하게 하는게 좋습니다.

     

    가장 훌륭한 최적화

    오히려 쿼리를 그 서비스에서 없애거나 튜닝할 필요가 없이 데이터를 최소화하는 것이 좋은 방법입니다.

    대안으로는 Read Model의 단순화를 통해 쿼리를 간결하게 만들고 힌트가 필요하지 않게 하는 것입니다.

     

     

    옵티마이저 힌트

    • 인덱스
    • 테이블 
    • 쿼리 블록(SELECT 키워로 시작하는 서브쿼리 영역)
    • 글로벌

     

    영향 범위에 따라 4개 그룹으로 나누어 볼 수 있습니다.

    매우 다양한 힌트들이 존재합니다.

     

    익숙하지 않은 힌트를 사용할 때는 EXPAIN 명령으로 힌트 문법상 오류가 없는지 확인하면 좋습니다.

    문법상 오류가 있다면 경고 메시지를 보여줍니다.

     

    예를 들면 쿼리의 실행 시간을 지정하는 힌트를 주어 지정된 시간이 초과하면 쿼리는 실패하게 됩니다.

    'CS > Real MySQL 8.0 요약' 카테고리의 다른 글

    9장 - 옵티마이저와 힌트 - 2편  (1) 2023.12.23
    9장 - 옵티마이저와 힌트 - 1편  (1) 2023.11.29
    8장 - 인덱스  (0) 2023.11.13
    5장 - 트랜잭션과 잠금  (1) 2023.10.26
    4장 - InnoDB 스토리지 엔진 아키텍처  (1) 2023.10.16

    댓글

Designed by Tistory.