안녕하세요. 간략하게 A테이블 승인날짜=2023-11-01 조건에는 몇십만개의 데이터가 있습니다. 취소날짜 역시 있구요.
현재는 아래와같이 쿼리가 INDEX MERGE ( A테이블의 승인날짜 인덱스 및 A테이블의 취소날짜 인덱스 )가 잡혀있는 상태입니다.
1 2 3 4 | SELECT * FROM TABLE A INNER JOIN TABLE B ON A.ID = B.ID WHERE (A.승인날짜 BETWEEN 2023-11-01 AND 2023-11-01 OR A.취소날짜 BETWEEN 2023-11-01 AND 2023-1101 ) AND B.결제사 = 07 ORDER BY 승인날짜 DESC LIMIT 0, 30 |
이때 결제사 07의 11월 1일 COUNT는 88 row인데요 ( B.결제사 에는 인덱스 X )
문제가 LIMIT 54 , 30까지는 슬로우쿼리로 뽑히지만 ( 5초정도 소요 )
LIMIT 55, 30 즉 54 이상부터는 데이터가 안뽑히고 타임아웃 떠버립니다. ( 데이터그립 )
현재 페이징 처리를 30개씩 하느라 LIMIT X , Y 중 Y는 30 고정이며 X는 0 , 30 , 60 순으로 진행되는데요
왜 이런 오류가 나는지 모르겠습니다. UNION ALL로 변환하여 풀면 LIMIT 55~ 60 , 30 해도 잘나오지만 더욱 느려져서 INDEX MERGE가 필요한 상황입니다.
어떠한 방법으로 접근을 해야하며 저 현상은 왜 저럴까요?
안녕하세요 답변 감사합니다.
현재는 결합인덱스로 (A승인날짜 A승인시간) INDEX가 있고
(A취소날짜 A취소시간) INDEX 가 있습니다. 이떄 A승인날짜 A취소날짜는 결합인덱스가 없는데 문제는
해당 테이블의 총 데이터가 몇천만개라 인덱스를 걸기가 어려운 상황입니다.
인덱스 제외한 쿼리로는 풀수 없는상황일까요?
말씀하신대로라면 LIMIT 58, 30까지는 나와야할텐데 이상하게 LIMIT 54,30 까지만 나오더라구요.
참고로 남은 4개의 데이터는 A.취소날짜의 DATA입니다. ORDER BY A.승인날짜 로 인하여 FULL SCAN이 돌아가는걸까요?
해당 케이스의 경우에는 ORDER BY에 A.취소날짜 까지 넣어주면 LIMIT 60, 30 도 나오지만
해당 케이스가 아닌 일반 케이스일때 A.취소날짜까지 ORDER BY를 넣으면 기존 1,2초만에 뽑히던 QUERY가 너무 느려지는 현상이있습니다 ㅜ