MYSQL 동일쿼리에서 조건에 대한 변수값만 다른데 타는 인덱스가 다른 현상에 대해 문의드립니다. 4

by 이준수 [SQL Query] [2022.09.07 16:20:11]


안녕하세요.

쿼리 질문 하나 드립니다..!

 

힌트를 걸어 인덱스를 강제하는 방법은 사용하고 싶지 않아서 원인을 찾고있습니다.

같은 쿼리인데 조건에 넣은 값에 따라 타는 인덱스가 달라져서

속도에 차이가 생기는데 무슨 이유인지 알 수 있을까요..?

MYSQL 사용하고있습니다..

 

두 쿼리의 차이점은 PORTAL_ID에 넣은 값 말고는 차이가 없습니다.

 

1. 느린 쿼리

SELECT *
FROM APPROVAL_DOCUMENT AD
    JOIN APPROVAL_FORM AF ON AD.FORM_ID = AF.FORM_ID AND AD.PORTAL_ID = AF.PORTAL_ID 
    LEFT OUTER JOIN APPROVAL_CODE AC ON AC.CODE_ID = AF.FORM_PARENT_ID AND AF.PORTAL_ID = AC.PORTAL_ID 
WHERE  AD.PORTAL_ID = '997'
    ORDER BY AD.REQ_DATE DESC, AD.APPR_ID DESC
    LIMIT  0, 10;

 

2. 빠른 쿼리

SELECT *
FROM APPROVAL_DOCUMENT AD
    JOIN APPROVAL_FORM AF ON AD.FORM_ID = AF.FORM_ID AND AD.PORTAL_ID = AF.PORTAL_ID 
    LEFT OUTER JOIN APPROVAL_CODE AC ON AC.CODE_ID = AF.FORM_PARENT_ID AND AF.PORTAL_ID = AC.PORTAL_ID 
WHERE  AD.PORTAL_ID = '998'
    ORDER BY AD.REQ_DATE DESC, AD.APPR_ID DESC
    LIMIT  0, 10;

 

원인을 모르겠는데 혹시 예측할만한 원인이 있을까요..?

 

APPROVAL_DOCUMENT 이 테이블만 조회했을때 998번일때가 실제 조회 건수는 더 많습니다.

 

첫번째 실행계획 사진이 느린 쿼리이고 두번째 실행계획 사진이 빠른 쿼리입니다.

감사합니다.

by 마농 [2022.09.07 16:54:56]

느린쿼리 : AD > AF > AC
빠른쿼리 : AF > AC > AD
우선 가볍게 시도해 볼만한게 이거 한번 해보세요. 효과가 있을지는 모르겠지만.
- 변경전 : WHERE ad.portal_id = 'P186'
- 변경후 : WHERE af.portal_id = 'P186'

느린쿼리는 AD 라인의 Ref 에 const 가 안보이는 거로 봐서
조회 조건이 엑세스 조건으로 사용되지 못한 듯 하네요.
인덱스는 검색용이 아닌 정렬용 인덱스가 사용된 느낌입니다.

AD 와 AF 의 조인에 사용되는 조건은 2개 항목(portal_id, form_id)인데
인덱스 사용은 1개 항목(form_id)만 사용하네요.
2개 항목 결합인덱스가 있으면 좋겠네요.


by 이준수 [2022.09.07 17:15:23]

답변 감사드립니다.

말씀해주신것처럼 정렬용 인덱스가 사용되어 느리게 됐습니다..

같은 쿼리의 조건 값이 다름에 따라 인덱스가 사용되는 것도 옵티마이저에 의해 변경이 될 수 있는건가요..?

똑같은 쿼리인데 하나는 액세스 조건으로 되고 하나는 그렇지 않은데 그렇다면 해당 테이블의 데이터도 확인을

해봐야할까요..?

본문에 인덱스 사진을 하나 올렸는데 해당테이블에 form_id와 portal_id로 이루어진 인덱스가 존재하긴 하는데 해당 인덱스를 사용하지 않았습니다..

limit를 0,15 이런식으로 바꾸면 느린 쿼리도 form_id와 portal_id로 이루어진 인덱스를 타게되어 빨라지는데

왜 그런지 알수가 없네요..


by 마농 [2022.09.07 18:25:42]

AD 에 (portal_id, req_date, appr_id) 인덱스가 있으면 해결될 것 같습니다.


by 이준수 [2022.09.13 14:11:16]

감사합니다!!

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