order by 튜닝 문의 드립니다~~~ 0 1 718

by po84 [MySQL] 정렬 Mysql [2017.12.25 06:49:00]


store_latitude(위도 필드명) , store_longitude(경도 필드명)

SELECT (6371*acos(cos(radians(37.7117084))*cos(radians(store_latitude))*cos(radians(store_longitude) -radians(126.4498920999))
+sin(radians(37.7117084))*sin(radians(store_latitude)))) AS store_distance

 

이런식으로 위도와 경도 필드값을 받아와서 계산하는 계산식이 있는데용.. SELECT 할때 해당 조건을 처리해서 store_distance 라는 임시의 필드명을 주고

그 값을 땡겨씁니다.. 문제는 store_distance <-- 이넘이 Order by 조건으로 무조건 들어가야되는데.. 만들어낸 값이다 보니까 index를 태울수가 없어서

얘만 들어갔다 하면 검색결과가 0.015초에서 1.5초로 바껴버립니다..ㅠㅠ 어떻게 하면 빠른속도 검색을 낼수 있을까요..선배님들 조언 부탁드립니다..!!

by 마농 [2017.12.26 08:32:43]

조회조건으로 입력되는 위도와 경도를 중심으로 해서
좌우 상하로 50 미터 씩 늘린 정사각형을 만듭니다.
해당 정사각형 안에 들어가는 자료가 존재하는지 체크합니다.(위도 + 경도 인덱스 필요)
 WHERE store_distance <= 50M
   AND 위도 BETWEEN :v_위도 - 50M AND :v_위도 + 50M
   AND 경도 BETWEEN :v_경도 - 50M AND :v_경도 + 50M
존재하면 정렬해서 결과 리턴해 주고요
존재하지 않으면 조회 범위를 늘립니다. 100M
100M 도 없으면 300M > 500M > 1KM 식으로...
검색 자료가 나올 때까지 범위를 늘려가며 검색하세요.
 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입