SQL

SQL 튜닝 일지.. index를 잡기위한 노력

강준한 2023. 6. 9. 10:14

요즘 부하가 걸릴정도의 트레픽을 다루는 서비스를 유지보수 하는일을 하고있다.

동접자가 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)

https://www.w3schools.com/sql/func_mysql_cast.asp

인자값은 다양하게 지원 하고 있는것을 확인 했다.

 

다음에 요기나게 사용 해볼수 있을 듯

반응형