최근에 MySQL에서 쿼리를 아래처럼 oder by 조건만 수정했는데 특정 사용자에 대해서만 인덱스가 다르게 타면서 쿼리가 갑자기 느려지는 증상이 나타나서 문의드립니다.
수정한 부분은 "INSERT_DT" 필드가 인덱스가 잡혀있지 않아서 성능 개선을 위해 인덱스가 잡힌 "REG_DT"로 order by를 변경한 것 뿐입니다.
테이블에 인덱스는 IDX01 (USER_ID), IDX02 (REG_DT) 이렇게 각각 잡혀 있습니다.
대부분의 사용자가 IDX01를 먼저 타고 IDX02를 타서 조회되는 모수가 줄어드는데, 특정 사용자들이 IDX02를 먼저 타고 IDX01을 타는 바람에 불필요한 데이터를 대량 조회하면서 쿼리 수행 시간이 급격히 늘어났습니다.
이런 문제가 어떤 원인으로 인해 갑자기 생길 수 있으며, 이를 쿼리 수정 및 테스트를 하면서 사전에 감지할 수 있는 방법이 없을까요?
쿼리 수정 전에 explain으로 실행 계획을 확인해볼 때 아무래도 사용자가 많다보니 모든 사용자를 확인하지 못하고 일부 사용자만 확인을 한 후에 실행 계획이 동일한 것으로 확인하고 적용했는데 이런 문제가 생기니 당황스럽습니다.
-- 수정전 SELECT * FROM TB_HISTORY WHERE USER_ID = 'abc123' AND REG_DT BETWEEN DATE_SUB(NOW(), INTERVAL 3 MONTH) AND NOW() ORDER BY INSERT_DT DESC LIMIT 10;
-- 수정 후 SELECT * FROM TB_HISTORY WHERE USER_ID = 'abc123' AND REG_DT BETWEEN DATE_SUB(NOW(), INTERVAL 3 MONTH) AND NOW() ORDER BY REG_DT DESC LIMIT 10;