DB

MySQL Hint

dev_roach 2022. 5. 9. 17:23
728x90

MySQL 에서 Hint 란 옵티마이저의 실행계획을 바꾸는 것을 뜻한다.

대부분의 MySQL 책에서 왠만해서 Hint 를 사용하는 일은 없을 것이라고 말했고, 오히려 내가 주는 Hint 가 "훈수" 느낌으로 될 수 있어서 오히려 성능을 악화시킬 수도 있다고 알고 있었다. 그리고 옵티마이저 자체가 대부분 똑똑한 의사결정을 해서 필요하다고 생각하지 않았는데, 오늘 신규프로젝트를 구성하던 도중 잘못사용하는걸 파악했다.

 

현재 쿼리를 날렸을때 실행계획은 아래와 같다.

test1 은 현재 자주사용하는 쿼리에 맞게 인덱스를 구성했는데, PRIMARY 인덱스를 사용해서 현재 filtered 가 10 밖에 나오지 않는다. 인덱스를 구성할때 test1 인덱스를 사용하여 filtered 가 100 이 되는게 내 목표였다. 그래서 SELECT Query 를 질의할때 Hint 를 사용해주었다. Hint 는 아래와 같이 사용하면 된다.

SELECT * 
FROM TEST_TABLE
USE INDEX (test1)
WHERE COL1=1 AND COL2=2;

USE INDEX ('사용할 인덱스 이름') 을 넣어주면 된다.

현재 상황의 경우에서는 'test1' 을 사용해야 했으므로 위와 같이 쿼리를 돌린 뒤 수행했다.

이제 알맞게 내 예상대로 filtered 100 이 나온 모습이다.

번외

혹시 옵티마이저가 통계를 아직 제대로 내지 않았나 싶어 아래와 같은 쿼리도 실행한뒤 다시 쿼리를 날려보았지만 결과는 같았다.

ANALYZE TABLE TEST_TABLE;

후기

Hint 를 한번도 써본적이 없었는데 이렇게 써야하는 경우가 있다는 것을 깨달았다.

다만 아쉬운건 왜 옵티마이저가 주키를 인덱스로 구성하는 방향을 선택했는지 잘 모르겠다.. 

MySQL 은 공부해도 공부해도 어렵다.

728x90

'DB' 카테고리의 다른 글

MySQL 미사용 인덱스 조회 하는 방법  (1) 2022.06.08