3. 믿었던 Function이 날 배신했다.
지난 쿼리 튜닝으로 기존 대비 절반 이상으로 실행 속도를 절감시켰다.
그러나 여기서 튜닝을 멈추지 않았다. 아니 멈출 수 없었다.
이번에 건드린 건 Function(≒Procedure, 프로시저)였다.
Function을 주석하고 실행하면 신기하게도 실행 속도가 빨라졌다.
왜 그런 것일까요?
GPT 선생님께 여쭤보았습니다.
더보기
MySQL에서 함수가 인덱스를 사용하는지 여부는 함수의 형태와 쿼리의 구성에 따라 다릅니다.
일반적으로, MySQL은 함수를 사용하여 쿼리를 실행할 때 인덱스를 사용하지 않습니다. 함수는 쿼리에서 조건절에 사용되는 경우 인덱스를 사용할 수 있는 기회를 제한합니다. 예를 들어, 다음과 같은 쿼리에서는 인덱스를 사용할 수 없습니다.
SELECT * FROM table WHERE my_function(column) = 'value';
위의 쿼리에서, my_function(column)이 함수를 호출하고 있기 때문에, 이는 인덱스를 사용하지 못하게 됩니다.
그러나 몇 가지 예외가 있습니다. MySQL에서 제공하는 함수 중 일부는 인덱스를 사용할 수 있습니다. 예를 들어, DATE_FORMAT() 함수는 적절한 경우에 인덱스를 사용할 수 있습니다.
또한, MySQL 5.7 이상에서는 "functional indexes"를 사용하여 함수 결과에 대한 인덱스를 만들 수 있습니다. 이렇게하면 함수 결과를 저장하고 인덱싱하여 쿼리 성능을 향상시킬 수 있습니다.
그러나 일반적으로 함수를 쿼리의 조건절에 직접 사용하는 것은 인덱스 사용을 제한하므로, 쿼리의 성능을 최적화하려면 함수를 사용하는 방법을 재고해야 할 수 있습니다.
MySQL에서 Function 안에 있는 쿼리는 인덱스를 타지 않았던 것..
해당 프로젝트는 5.7 이하 버전이였기에 Function을 모두 걷어내기로 결정!
Funciton을 모두 걷어내니 실행속도가 대폭 감소하였다.
2차 쿼리 튜닝 전후 속도 비교는 아래와 같다.