본문 바로가기

쓸만한 주저리

MariaDB에서 서브쿼리 인덱스 걸기

반응형

마리아디비라고 서브쿼리 인덱스 거는 게 특별한 게 아니다.

그냥 HeidiSQL에서 인덱스 걸면 된다.

그러면 왜 이걸 굳이 블로그로 쓰느냐...?


먼저 쿼리를 보자.

SELECT

SUM(distance)

FROM (

SELECT

(6371*ACOS(COS(RADIANS(aa.lat))*COS(RADIANS(b.lat))*COS(RADIANS(b.lng)-RADIANS(aa.lng))+SIN(RADIANS(aa.lat))*SIN(RADIANS(b.lat)))) distance

FROM (

SELECT

idx,

lat,

lng,

(SELECT MIN(idx) FROM delivery_log WHERE idx>a.idx AND barcode=_barcode) next_idx

FROM delivery_log a

WHERE barcode=_barcode

) aa

JOIN delivery_log b ON aa.next_idx=b.idx

) aaa;



_barcode를 입력받아서 사용하고 있다.

같은 바코드가 있을 경우 위치값의 앞뒤를 비교해서 거리를 구하고, 그 거리를 합해서 총 이동 거리를 반환하는 쿼리다.

그런데 어느날 갑자기 이게 느리다는 걸 알게 되었다.

그래서 여기저기 살피다가 하이디에서 실행계획 보는 법까지 찾아서 봤는데

인덱스를 안 타는 게 있어서 인덱스를 걸어 줘도 여전히 느리더라.

이 부분이 핵심

실행계획에서는 이제 인덱스 탄다는데 왜 느릴까???

한참 생각해 보다가 혹시나 하고 서브쿼리에 있는 _barcode를 a.barcode로 바꿨다.

이미 a에 _barcode를 연결했으니, a.barcode로 써도 문제는 없다.

(SELECT MIN(idx) FROM delivery_log WHERE idx>a.idx AND barcode=_barcode)

 => (SELECT MIN(idx) FROM delivery_log WHERE idx>a.idx AND barcode=a.barcode)


그리고...

빨라졌다.

굳이 내부적으로 어떤 구조를 가지고 있어서 빨라졌다 말하고 싶지도 않고 그럴 지식도 없다.

하지만 서브쿼리를 쓸 때, 부모 쿼리에서 연결된 값을 서브쿼리에서도 쓰는 것보다는 부모 쿼리와 연결하는 게 빠른 모양이다.

혹시 도움이 될까 하여 남긴다.


반응형