2016-08-31 3 views
0

약 50,000 개의 레코드가있는 테이블에서 실행되는 다음 MYSQL 쿼리가 있습니다. 쿼리는 반경 20 마일 이내의 레코드를 반환하며 레코드의 범위를 좁히기 위해 where 절에서 테두리 상자를 사용하고 있습니다. 쿼리는 거리별로 정렬되며 페이지가 매겨진 페이지에서 사용되므로 10 개의 레코드로 제한됩니다.MYSQL 쿼리 성능 - 거리 검색

현재 평균적으로 쿼리를 완료하는 데 0.0210 초가 걸리지 만 웹 사이트가 너무 바빠서이를 개선 할 방법을 찾고 있습니다.

adverts 테이블에는 약 20 개의 열이 있고 경도 및 위도 열에 대한 인덱스가 있습니다.

어쨌든 누구나이 쿼리의 성능을 향상시킬 수 있습니까? 그냥 advert_id 및 경도 및 위도 필드가있는 별도의 테이블을 만드는 방법에 대해 생각해 보았지만 누군가가 아래의 쿼리를 개선 할 수있는 다른 제안이나 방법이 있는지 궁금합니다.

SELECT adverts.advert_id, 
     round(sqrt((((adverts.latitude - '52.536320') * 
      (adverts.latitude - '52.536320')) * 69.1 * 69.1) + 
      ((adverts.longitude - '-2.063380') * 
      (adverts. longitude - '-2.063380') * 53 * 53)), 
      1) as distance FROM adverts 
    WHERE (adverts.latitude BETWEEN 52.2471737281 AND 52.8254662719) 
     AND (adverts.longitude BETWEEN -2.53875093307 AND -1.58800906693) 
    having (distance <= 20) 
    ORDER BY distance ASC 
    LIMIT 10 

답변

0

공간 데이터 형식과 공간 인덱스 : how to use them을 사용해야합니다.

특히 POINT 데이터 형식을 사용하여 위도와 경도를 단일 열에 저장 한 다음 해당 열에 공간 인덱스를 추가해야합니다.

공간 색인은 일반적으로 주어진 영역의 모든 지점을 검색하는 비용이 로그가되도록 R-tree (또는 유도)로 구현됩니다.

+0

'SHOW CREATE TABLE'을 보겠습니다. 어떤 MySQL 버전입니까? –

+0

@RickJames 위의 문서는 mysql 5.7을 참조하므로 최소한 모든 버전에서 작동합니다 (그러나 이전 버전에서도 대부분의 기능을 보았습니다). [there] (https://dev.mysql.com/doc/refman/5.7/en/creating-spatial-indexes.html)에는 공간 인덱스를 추가하는 create table의 좋은 예가 있습니다. 간단히 GEOMETRY를 POINT로 대체하십시오. 이 경우 생성 된 유일한 열도 기본 키입니다. 중복 된 포인트를 저장하려면 분명히 기본 키로 사용할 다른 컬럼을 추가해야합니다. –

+0

죄송합니다. 아마 @Mark에 대한 제 질문을 의미했습니다. –