LIMIT 타임 아웃 질문드립니다. 0 4 3,552

by 초보개발자001a [MySQL] MYSQL LIMIT [2023.11.30 21:01:53]


안녕하세요. 간략하게 A테이블 승인날짜=2023-11-01 조건에는 몇십만개의 데이터가 있습니다. 취소날짜 역시 있구요.

현재는 아래와같이 쿼리가 INDEX MERGE ( A테이블의 승인날짜 인덱스 및 A테이블의 취소날짜 인덱스 )가 잡혀있는 상태입니다.

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가 필요한 상황입니다.

어떠한 방법으로 접근을 해야하며 저 현상은 왜 저럴까요?

by 마농 [2023.11.30 22:32:39]

몇십만건중에 달랑 88건을 뽑아오고 있습니다.
거의 모든 자료가 읽고 나서 버려지는 것입니다.
30건만 뽑으면 그나마 전체 다 안읽어도 채울 가능성이 있는데
90건을 뽑으려면 88건밖에 없으니 90건을 채우질 못해 남은 2건을 채우기 위해 몇십만건 전체를 다 읽어야 합니다.
원인은 이렇고 해결법은 결합인덱스 입니다.
결합인덱스 하면 수십만건이 아닌 수십건만 읽고 바로 끝날 수 있습니다.


by 초보개발자001a [2023.12.01 08:44:11]

안녕하세요 답변 감사합니다.
현재는 결합인덱스로 (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가 너무 느려지는 현상이있습니다 ㅜ 


by 마농 [2023.12.01 09:56:46]

제가 말한 결합은 결재사가 포함된 걸 말한 것입니다.
- (결재사, 승인일자)
- (결재사, 취소일자)


by 초보개발자001a [2023.12.08 13:50:24]

결재사는 다른 테이블이라 애매한데 우선 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입