CS 지식/데이터베이스

MySQL Hint (옵티마이저 힌트 & 인데스 힌트)

Zin0_0 2022. 7. 29. 15:47
반응형

Hint

  • 조인이나 인덱스 실행 계획을 개발자가 옵티마이저에 힌트를 주어 바꿀 수 있는 것이 힌트
  • 옵티마이저 힌트인덱스 힌트 두 종류로 나뉜다.

옵티마이저 힌트

  • optimizer_switch 시스템 변수를 설정하여 제어 가능
    • 후속 쿼리에 대한 영향을 주기 때문에 mysql에 대한 이해도가 깊지 않다면 지양해야한다.
  • 명령문 내의 옵티마이저 힌트
    • optimizer_switch 보다 선행되며 다양한 범위 수준에서 적용된다.
      • 전역
        • 전체 문에 영향
      • 쿼리 블록
        • 명령문 내의 특정 쿼리 블록에만 영향
      • 테이블
        • 쿼리 블록 내의 특정 테이블에만 영향
      • 인덱스
        • 테이블 내의 특정 인덱스에만 영향
  • 주석 내에 지정해서 사용하며 SEMIJOIN, BKA 등이 있다. (상세한 것은 나중에 옵티마이저 힌트가 필요해지면 추가 정리)

인덱스 힌트

  • query plan을 확인하다보면 원하지 않는 인덱스를 탄다거나, 인덱스를 타지 않는 경우, 인덱스 순서가 비효율적인 경우가 종종 발생한다.
  • 쿼리가 복잡한 경우 종종 발생하는데, 이럴 때 인덱스에 대한 힌트를 쿼리에 심어주어 원하는 인덱스를 탈 수 있도록 도울 수 있다.
  • FORCE INDEX
    • USE 키워드와 동일한 기능을 하지만, 옵티마이저에게 보다 강하게 해당 인덱스를 사용하도록 권장
      • 지정한 인덱스만 사용하도록 명령
    • SELECT *
        FROM TEST_TABLE FORCE INDEX(INK1_TEST_TABLE)
       WHERE id = 1
         AND name = "박진영";
  • USE INDEX
    • 특정 인덱스를 사용하도록 권장
      • 지정한 인덱스를 우선적으로 사용하되, 옵티마이저가 다른 인덱스를 사용하는 것이 낫다고 판단하면 다른 인덱스를 사용
    • SELECT *
        FROM TEST_TABLE USE INDEX(INK1_TEST_TABLE)
       WHERE id = 1
         AND name = "박진영";
  • IGNORE INDEX
    • 특정 인덱스를 사용하지 않도록 지정
    • SELECT *
        FROM TEST_TABLE IGNORE INDEX(INK2_TEST_TABLE)
       WHERE id = 1
         AND name = "박진영";
  • join과 oreder by, group by에도 인덱스 힌트를 줄 수 있다.
    • USE INDEX FOR JOIN
      • JOIN 키워드는 테이블 간 조인 뿐만아니라 레코드 검색하는 용도까지 포함
    • USE INDEX FOR ORDER BY
      • 명시된 인덱스를 ORDER BY 용도로만 사용하도록 제한
    • USE INDEX FOR GROUP BY
      • 명시된 인덱스를 GROUP BY 용도로만 사용하도록 제한

Reference

https://velog.io/@bae_mung/TIL-MySQL-Hint

https://wakestand.tistory.com/562

반응형