¿Cómo calcula Yelp eficientemente la distancia en la base de datos?


9

Por ejemplo, digamos que tengo una tabla:

Business(BusinessID, Lattitude, Longitude)

Todos están indexados, por supuesto. También hay 1 millón de registros

Digamos que quiero encontrar negocios más cercanos a 106,5, por ejemplo, ¿cómo lo haría?

Si lo hago

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

por ejemplo, o si lo hago

SELECT *
FROM Business
TOP 20

En teoría, la computadora tendrá que calcular la distancia para todos los negocios, mientras que en la práctica solo aquellos con latitud y longitud dentro de un cierto rango que deben calcularse.

Entonces, ¿cómo puedo hacer lo que quiero en PhP o SQL, por ejemplo?

Estoy agradecido con la respuesta hasta ahora. Estoy usando mysql y no tienen nada más eficiente que la solución obvia. MySQL espacial tampoco tiene función de cálculo de distancia.

Respuestas:


8

Si entiendo la pregunta correctamente (y no estoy seguro de que lo haga), ¿le preocupa calcular "(Some formula to compute distance here)"cada fila de la tabla cada vez que realiza una consulta?

Esto puede mitigarse hasta cierto punto mediante el uso de los índices latitudey, longitudepor lo tanto, solo tenemos que calcular la distancia para una 'caja' de puntos que contienen el círculo que realmente queremos:

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

Donde se eligen 96, 116, etc. para que coincidan con la unidad del valor '2000' y el punto del globo desde el que se calculan las distancias.

La precisión con la que esto use índices dependerá de su RDBMS y de las elecciones que tome su planificador.

En términos generales, esta es una forma primitiva de optimizar un tipo de búsqueda de vecino más cercano . Si su RDBMS admite índices GiST , como postgres, entonces debería considerar usarlos en su lugar.


Usé mysql Sin embargo, algunos motores mysql admiten geopatial, aunque no innodb.
user4951

¿Tengo razón en que no tiene opción de cambiar de MySQL? En cuyo caso, por favor, etiquetar la pregunta de MySQL
Jack dice intento topanswers.xyz

En realidad ahora agrego la tabla auxiliar de myisam ahora, ¿cómo hago esto de manera eficiente?
user4951

Bueno, puedo usar mongodb. No he decidido eso. Sin embargo, estoy más familiarizado con mysql.
user4951

1
Mi consejo sería familiarizarse con postgres si es posible: en comparación con MongoDB, es mucho más similar a MySQL y tiene un historial sólido con datos espaciales, y sus comentarios en otros lugares indican que prefiere 'gratis'.
Jack dice que intente topanswers.xyz

6

(Divulgación: soy un chico de Microsoft SQL Server, así que mis respuestas están influenciadas por eso).

Para hacerlo realmente eficientemente, hay dos cosas que desea: almacenamiento en caché y soporte de datos espaciales nativos. El soporte de datos espaciales le permite almacenar datos de geografía y geometría directamente en la base de datos sin hacer cálculos intensivos / costosos sobre la marcha, y le permite construir índices para encontrar muy rápidamente el punto más cercano a su ubicación actual (o la ruta más eficiente o lo que sea).

El almacenamiento en caché es importante si desea escalar, punto. La consulta más rápida es la que nunca haces. Cada vez que un usuario le pide lo más cercano, usted almacena su ubicación y el conjunto de resultados en un caché como Redis o memcached durante un período de horas. Las ubicaciones de las empresas no cambiarán durante 4 horas; bueno, podrían cambiar si alguien edita una empresa, pero no necesariamente necesita que se actualice de inmediato en todos los conjuntos de resultados.


No puedo determinar desde su enlace si SQL Server realmente indexa datos espaciales de una manera que sea útil para obtener una lista de puntos cercanos, ¿verdad?
Jack dice que intente topanswers.xyz


La cuestión es que estoy usando mysql y he verificado que no tienen ningún algoritmo más eficiente que el que prescribió Jack Douglas. Me pregunto si mysql hará ese tipo de cosas como el almacenamiento en caché. Microsoft SQL es de pago y mysql es gratis
user4951

1
La ubicación de la empresa no cambiará todo el tiempo, pero la ubicación de las personas sí.
user4951

0

Yelp probablemente usa SIG

PostgreSQL tiene la implementación de referencia para SIG con PostGIS . Yelp puede estar usando MySQL, que es inferior en todos los sentidos . En el caso de algo como Yelp, casi con seguridad mantienen las coordenadas para,

  • El usuario
  • Los destinos potenciales

Esas coordenadas están casi seguramente en WGS84 y se almacenan como tipo de Geografía. En PostgreSQL y PostGIS se vería algo así,

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;

Ellos llenarían esa mesa. Luego toman las coordenadas WGS84 de su teléfono y generan una consulta, como esta con SQL Alchemy (en el caso de Yelp),

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

Para obtener más información, consulte nuestro y consulte Sistemas de información geográfica en StackExchange

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.