요즘 부하가 걸릴정도의 트레픽을 다루는 서비스를 유지보수 하는일을 하고있다.
동접자가 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)
인자값은 다양하게 지원 하고 있는것을 확인 했다.
다음에 요기나게 사용 해볼수 있을 듯
'SQL' 카테고리의 다른 글
각 DBMS 별로 스프링 부트의 MYBATIS 에서 LIKE 검색 하는 방법 (0) | 2024.04.29 |
---|---|
[MySql] LIKE 대신 FULLTEXT Index로 검색기능을 구현해보자! (0) | 2023.04.06 |
select,update,rollback,commit 문의 처리 순서 (0) | 2015.04.15 |
mysql 한글 문제 해결 (0) | 2015.04.01 |