먼저 쿼리문을 보시면요..
SELECT
A.EMAIL, A.NICK_NAME, A.BIRTH_DATE, A.JENDER, A.INTRODUCE,
IFNULL(A.INTEREST_SCORE, 0) AS INTEREST_SCORE,
ROUND( 6371 * ACOS( COS( RADIANS(37.62709565) ) * COS( RADIANS( A.LATITUDE ) ) * COS( RADIANS( A.LONGITUDE ) - RADIANS(127.0335156) ) + SIN( RADIANS(37.62709565) ) * SIN( RADIANS( A.LATITUDE ) ) ), 1) AS DISTANCE,
'' AS IMG,
A.MAIN_PROFILE_FILE AS URL, (YEAR(CURDATE())-YEAR(DATE_FORMAT(A.BIRTH_DATE, '%Y%m%d')))+1 AS AGE
FROM MT_MEMBER A
WHERE A.LATITUDE <> 0
AND A.REPORT_COUNT < 4
AND A.JENDER = 'M'
AND A.BIRTH_DATE BETWEEN '19210101' AND '20111231'
AND A.MAIN_PROFILE_FILE IS NOT NULL
AND A.C2DM_POSSIBLE = 'Y'
AND A.EMAIL NOT IN (SELECT BLOCK_EMAIL FROM MT_BLOCK_MEMBER D WHERE EMAIL = 'jin@jingyu.kr')
AND A.EMAIL NOT IN (SELECT EMAIL FROM MT_BLOCK_MEMBER E WHERE BLOCK_EMAIL = 'jin@jingyu.kr')
AND A.LAST_CONN_DATE > DATE_ADD( CURDATE(), INTERVAL -3 DAY )
AND ROUND( 6371 * ACOS( COS( RADIANS(37.62709565) ) * COS( RADIANS( A.LATITUDE ) ) *
COS( RADIANS( A.LONGITUDE ) - RADIANS(127.0335156) ) + SIN( RADIANS(37.62709565) ) *
SIN( RADIANS( A.LATITUDE ) ) ), 1) >= CONVERT('0', UNSIGNED)
AND ROUND( 6371 * ACOS( COS( RADIANS(37.62709565) ) * COS( RADIANS( A.LATITUDE ) ) *
COS( RADIANS( A.LONGITUDE ) - RADIANS(127.0335156) ) + SIN( RADIANS(37.62709565) ) *
SIN( RADIANS( A.LATITUDE ) ) ), 1) <= CONVERT('99999999', UNSIGNED)
ORDER BY DISTANCE
LIMIT 0 , 200;
보시면 그냥 단일테이블에서 조회 쿼리입니다. 서브쿼리도 들어갔지만 order by 만 빼면 전현 문제될게 없더군요..
그런데 문제는 조회요청자의 위도와경도를 가지고 거리를 구한다음에 거리순으로 보여야 하는데 문제가 있습니다.
기존에는 데이터가 적어 문제없었습니다. 15만이 넘으니 사용자 접속량에 따라 2~10+초가 걸리는군요..
이것저것 빼고 해보니 문제는 ORDER BY DISTANCE 구문이 문제입니다.
email이 키인데 order by email 하면 순식간입니다.
distance는 조회시 만들어진 alias칼럼이라 KEY가 아니니 느린건 당연한데 방법이 없을까요..ㅜㅜ
참고로 innodb 입니다.
아래는 explain 결과 입니다.
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY A ref PRIMARY,idx3_mt_member,idx1_mt_member idx3_mt_member 1 const 62991 Using where; Using filesort
3 DEPENDENT SUBQUERY E unique_subquery PRIMARY PRIMARY 604 func,const 1 Using index; Using where
2 DEPENDENT SUBQUERY D eq_ref PRIMARY PRIMARY 604 const,func 1 Using where; Using index