In che modo Yelp calcola in modo efficiente la distanza nel database?


9

Ad esempio, supponiamo che io abbia una tabella:

Business(BusinessID, Lattitude, Longitude)

Tutti sono indicizzati ovviamente. Inoltre ci sono 1 milione di record

Supponiamo di voler trovare aziende vicine a 106,5, ad esempio, come farei?

Se lo faccio

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

per esempio, o se lo faccio

SELECT *
FROM Business
TOP 20

In teoria il computer dovrà calcolare la distanza per tutti i biz mentre in pratica solo quelli con latitudine e longitudine entro un certo intervallo che dovrebbero essere calcolati.

Quindi, come posso fare quello che voglio in PhP, o SQL, per esempio?

Sono grato per la risposta finora. Sto usando mysql e non hanno nulla di più efficiente della soluzione ovvia. MySQL spaziale non ha nemmeno la funzione di distanza di calcolo.

Risposte:


8

Se capisco correttamente la domanda (e non sono sicuro di farlo), sei preoccupato per il calcolo "(Some formula to compute distance here)"per ogni riga della tabella ogni volta che fai una query?

Questo può essere mitigato in una certa misura usando gli indici su latitudee longitudequindi dobbiamo solo calcolare la distanza per una 'scatola' di punti contenente il cerchio che vogliamo effettivamente:

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

Dove 96, 116 ecc. Vengono scelti in modo da corrispondere all'unità del valore "2000" e al punto sul globo da cui si stanno calcolando le distanze.

Il modo preciso in cui questo utilizza gli indici dipenderà dal tuo RDBMS e dalle scelte fatte dal suo planner.

In termini generali, questo è un modo primitivo di ottimizzare una specie di ricerca del vicino più vicino . Se il tuo RDBMS supporta gli indici GiST , come Postgres , dovresti invece considerarli.


Ho usato mysql. Tuttavia, alcuni motori mysql supportano il geopatial sebbene non innodb.
user4951

Ho ragione che non hai alcuna opzione per cambiare da MySQL? In tal caso, per favore
tagga

In realtà ora aggiungo una tabella ausiliaria di myisam ora come posso farlo in modo efficiente allora?
user4951

Bene, posso usare mongodb. Non l'ho deciso. Tuttavia, conosco molto bene mysql.
user4951

1
Il mio consiglio sarebbe di familiarizzare con Postgres se possibile - rispetto a MongoDB è molto più simile a MySQL e ha una solida storia con dati spaziali, e i tuoi commenti altrove indicano che preferisci "libero".
Jack dice di provare topanswers.xyz il

6

(Rivelazione: sono un tipo Microsoft SQL Server, quindi le mie risposte sono influenzate da questo.)

Per farlo davvero in modo efficiente, ci sono due cose che desideri: memorizzazione nella cache e supporto dei dati spaziali nativi. Il supporto dei dati spaziali consente di archiviare i dati di geografia e geometria direttamente nel database senza eseguire calcoli intensivi / costosi al volo e consente di creare indici per trovare molto rapidamente il punto più vicino alla posizione corrente (o percorso più efficiente o altro).

La memorizzazione nella cache è importante se si desidera ridimensionare, punto. La query più veloce è quella che non fai mai. Ogni volta che un utente chiede le cose più vicine a lui, memorizzi la sua posizione e il set di risultati in una cache come Redis o memcached per un periodo di ore. Le sedi delle attività commerciali non cambieranno per 4 ore - beh, potrebbero esserlo se qualcuno modifica un'attività commerciale, ma non è necessario che sia immediatamente aggiornato in tutti i set di risultati.


Non riesco a capire dal tuo link se SQL Server indicizza davvero i dati spaziali in un modo utile per ottenere un elenco di punti nelle vicinanze - vero?
Jack dice di provare topanswers.xyz l'


Il fatto è che sto usando mysql e ho verificato che non hanno alcun algoritmo più efficiente di quanto prescritto da Jack Douglas. Mi chiedo se mysql farà quel genere di cose come la memorizzazione nella cache. Microsoft SQL è a pagamento e mysql è gratuito
user4951

1
La posizione dell'attività non cambierà continuamente, tuttavia la posizione delle persone cambierà.
user4951

0

Probabilmente Yelp utilizza GIS

PostgreSQL ha l'implementazione di riferimento per GIS con PostGIS . Yelp potrebbe utilizzare MySQL che è inferiore in ogni modo . Nel caso di qualcosa come Yelp, quasi sicuramente mantengono le coordinate per,

  • L'utente
  • Le potenziali destinazioni

Quelle coordinate sono quasi certamente in WGS84 e memorizzate come tipo Geografia. In PostgreSQL e PostGIS sarebbe simile a questo,

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;

Avrebbero riempito quel tavolo. Quindi prendono le coordinate WGS84 dal telefono e generano una query, come questa con SQL Alchemy (nel caso di Yelp),

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

Per ulteriori informazioni, consulta il nostro e controlla Geographic Information Systems @ StackExchange

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.