안녕하세요.
쿼리 질문 하나 드립니다..!
힌트를 걸어 인덱스를 강제하는 방법은 사용하고 싶지 않아서 원인을 찾고있습니다.
같은 쿼리인데 조건에 넣은 값에 따라 타는 인덱스가 달라져서
속도에 차이가 생기는데 무슨 이유인지 알 수 있을까요..?
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번일때가 실제 조회 건수는 더 많습니다.
첫번째 실행계획 사진이 느린 쿼리이고 두번째 실행계획 사진이 빠른 쿼리입니다.
감사합니다.
느린쿼리 : 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개 항목 결합인덱스가 있으면 좋겠네요.
답변 감사드립니다.
말씀해주신것처럼 정렬용 인덱스가 사용되어 느리게 됐습니다..
같은 쿼리의 조건 값이 다름에 따라 인덱스가 사용되는 것도 옵티마이저에 의해 변경이 될 수 있는건가요..?
똑같은 쿼리인데 하나는 액세스 조건으로 되고 하나는 그렇지 않은데 그렇다면 해당 테이블의 데이터도 확인을
해봐야할까요..?
본문에 인덱스 사진을 하나 올렸는데 해당테이블에 form_id와 portal_id로 이루어진 인덱스가 존재하긴 하는데 해당 인덱스를 사용하지 않았습니다..
limit를 0,15 이런식으로 바꾸면 느린 쿼리도 form_id와 portal_id로 이루어진 인덱스를 타게되어 빨라지는데
왜 그런지 알수가 없네요..
AD 에 (portal_id, req_date, appr_id) 인덱스가 있으면 해결될 것 같습니다.
감사합니다!!