마리아디비라고 서브쿼리 인덱스 거는 게 특별한 게 아니다.
그냥 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)
그리고...
빨라졌다.
굳이 내부적으로 어떤 구조를 가지고 있어서 빨라졌다 말하고 싶지도 않고 그럴 지식도 없다.
하지만 서브쿼리를 쓸 때, 부모 쿼리에서 연결된 값을 서브쿼리에서도 쓰는 것보다는 부모 쿼리와 연결하는 게 빠른 모양이다.
혹시 도움이 될까 하여 남긴다.
'쓸만한 주저리' 카테고리의 다른 글
어린이날, 경마공원에 소풍 갈까? (0) | 2019.05.03 |
---|---|
인천공항 장기 주차 다자녀 감면 신청하기 (0) | 2019.05.02 |
서경 안심 요금제 한 달 사용 후기 (0) | 2018.09.04 |
크롬에 악성코드 퇴치기가!!! (0) | 2018.08.13 |
길찾기 알고리즘 소개 (1) | 2018.08.06 |