Yelp는 데이터베이스에서 거리를 어떻게 효율적으로 계산합니까?


9

예를 들어 테이블이 있다고 가정 해보십시오.

Business(BusinessID, Lattitude, Longitude)

물론 모두 색인됩니다. 또한 백만 개의 기록이 있습니다

예를 들어 106,5에 가장 가까운 업체를 찾고 싶다고 가정 해 보겠습니다.

만약 내가한다면

SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000

예를 들어

SELECT *
FROM Business
TOP 20

이론적으로 컴퓨터는 모든 비즈의 거리를 계산해야하지만 실제로는 특정 범위 내에서 위도와 경도가있는 거리 만 계산해야합니다.

예를 들어 PhP 또는 SQL에서 원하는 작업을 어떻게 수행 할 수 있습니까?

지금까지 답변에 감사드립니다. 나는 mysql을 사용하고 있으며 명확한 솔루션보다 더 효율적인 것은 없습니다. MySQL 공간에는 계산 거리 기능도 없습니다.

답변:


8

질문을 올바르게 이해하고 확실 "(Some formula to compute distance here)"하지 않은 경우 쿼리를 수행 할 때마다 테이블의 모든 행에 대한 계산이 걱정 됩니까?

이것은에 인덱스를 사용하여 어느 정도 완화 될 수 latitudelongitude우리는 우리가 실제로 원하는 원을 포함 포인트 '상자'에 대한 거리를 계산해야하므로 :

select * from business
where (latitude>96 and latitude<116) and 
      (longitude>-5 and longitude<15) and 
      (Some formula to compute distance here) < 2000

값 '2000'의 단위와 거리를 계산하는 지구상의 점과 일치하도록 96, 116 등이 선택됩니다.

이것이 인덱스를 얼마나 정확하게 사용하는지는 RDBMS 및 계획자가 선택한 선택에 따라 다릅니다.

일반적으로이 방법은 가장 가까운 이웃 검색 을 최적화하는 기본 방법입니다 . RDBMS가 postgres 와 같은 GiST 인덱스를 지원하는 경우 대신 해당 인덱스를 사용하는 것이 좋습니다.


나는 mysql을 사용했다. 그러나 일부 mysql 엔진은 innodb는 아니지만 지리 공간을 지원합니다.
user4951

MySQL에서 변경할 옵션이 없다는 것이 맞습니까? 이 경우 질문에 태그를하시기 바랍니다 MySQL의
잭은 말한다 topanswers.xyz 시도

실제로 이제는 내 isisam의 보조 테이블을 추가합니다. 그러면 어떻게 효율적으로 수행합니까?
user4951

mongodb를 사용할 수 있습니다. 나는 그것을 결정하지 않았습니다. 그러나 나는 mysql에 가장 익숙하다.
user4951

1
내 조언은 MongoDB와 비교할 때 postgres에 익숙해지는 것입니다 .MongoDB와 비교하면 MySQL과 훨씬 유사하고 공간 데이터가있는 견고한 역사를 가지고 있으며 다른 곳에서는 귀하가 '무료'를 선호한다고 말합니다.
잭 topanswers.xyz 시도라고

6

(공개 : 저는 Microsoft SQL Server 직원이므로 제 답변이 그 영향을받습니다.)

실제로 효율적으로 수행하려면 캐싱과 기본 공간 데이터 지원이라는 두 가지가 필요합니다. 공간 데이터 지원을 사용하면 집중적 / 고가의 계산을 수행하지 않고도 지리 및 형상 데이터를 데이터베이스에 직접 저장할 수 있으며 현재 위치 (또는 가장 효율적인 경로 등)에 가장 가까운 지점을 매우 빠르게 찾을 수 있도록 인덱스를 작성할 수 있습니다.

스케일링, 기간을 조정하려면 캐싱이 중요합니다. 가장 빠른 쿼리는 결코 만들 수없는 쿼리입니다. 사용자가 가장 가까운 것을 요청할 때마다 자신의 위치와 결과 집합을 Redis 또는 memcached와 같은 캐시에 일정 시간 동안 저장합니다. 업체 위치는 4 시간 동안 변경되지 않습니다. 누군가가 업체를 수정하는 경우 비즈니스 위치가 변경 될 수 있지만 모든 결과 세트에서 즉시 업데이트 할 필요는 없습니다.


SQL Server가 실제로 주변 지점 목록을 얻는 데 유용한 방식으로 공간 데이터를 색인화하는지 여부를 링크에서 해결할 수 없습니다. 그렇지 않습니까?
잭 topanswers.xyz 시도라고


문제는 mysql을 사용하고 있으며 Jack Douglas가 처방 한 것보다 효율적인 알고리즘이 없다는 것을 확인했습니다. mysql이 캐싱과 같은 종류의 작업을 수행하는지 궁금합니다. Microsoft SQL은 유료이며 mysql은 무료입니다
user4951

1
사업장 위치는 항상 변경되지 않지만 사람들의 위치는 변경됩니다.
user4951

0

Yelp는 아마도 GIS를 사용할 것입니다

PostgreSQL에는 PostGIS를 사용 하여 GIS에 대한 참조 구현이 있습니다. Yelp는 모든면에서 열등한 MySQL을 사용하고있을 수 있습니다 . Yelp와 같은 경우 거의 확실하게 좌표를 유지합니다.

  • 사용자
  • 잠재적 인 목적지

이러한 좌표는 거의 확실하게 WGS84에 있으며 지리 유형으로 저장됩니다. PostgreSQL 및 PostGIS에서는 다음과 같이 보입니다.

CREATE TABLE businesses (
  id   int               GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name text,
  geog geography(point)
);
CREATE INDEX ON businesses USING gist(geog);
.... fill table
ANALYZE businesses;

그들은 그 테이블을 채울 것입니다. 그런 다음 휴대 전화에서 WGS84 좌표를 가져 와서 SQL Alchemy (Yelp의 경우)와 같은 쿼리를 생성합니다.

SELECT *
FROM businesses AS b
WHERE ST_DWithin( b.geog, ST_MakePoint(userLong,userLat) );

자세한 내용은 정보를 참조하고 지리 정보 시스템 @ StackExchange를 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.