SQL 튜닝 일지.. index를 잡기위한 노력
요즘 부하가 걸릴정도의 트레픽을 다루는 서비스를 유지보수 하는일을 하고있다.
동접자가 6000까지 올라갈 정도로 인기? 가많은 서비스 인데 업데이트 실수가 있었다.
범인은 바로 index ....
쿼리 튜닝에 있어 index 는 기본중에 기본인데 오늘 새로 알았던 사실을 적어본다.
left join on 사용자정보.userId= 주문정보.userId
이런식의 조인 결과가 있었는데
테이블 구조는 이렇다.
대충 이러한 구조인데 ... 이상한점을 금방 눈치차린 사람도 있겠지만 ... 초반에는 아무런 생각조차 못하고 있었다
물론 사용자테이블의 userId 는 기본키라 인덱스가 걸려있었고
주문테이블의 userId 는 인덱스 생성을 한 상태
당연히 인덱스끼리의 조인이라 별 문제 없을줄 알았으나 이는 slowquery 를 유발 했다
explain 으로도 엄청난 자원을 소모 하고 있었고 그이유는 타입 int 형과 타입 char 의 서로 상이한 타입과의 조인 이었다.
사용자테이블의 userId 는 int, 주문테이블의 사용자 아이디는 varchar 여서 서로 문제가 되었다.
이는 CAST 함수를 사용해서 해결 했다.
left join on CAST(사용자정보.userId AS CHAR)= 주문정보.userId
조인하는 한쪽을 형변환 하여 조인 하니 index 가 잘 걸리는 것을 확인 하였다.
cast 함수를 찾아보니
CAST(value AS datatype)
인자값은 다양하게 지원 하고 있는것을 확인 했다.
다음에 요기나게 사용 해볼수 있을 듯