AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 4210
Accepted
user4951
user4951
Asked: 2011-08-01 06:59:03 +0800 CST2011-08-01 06:59:03 +0800 CST 2011-08-01 06:59:03 +0800 CST

Como o Yelp calcula com eficiência a distância no banco de dados?

  • 772

Por exemplo, digamos que eu tenha uma tabela:

Business(BusinessID, Lattitude, Longitude)

Todos são indexados, é claro. Também há 1 milhão de registros

Digamos que eu queira encontrar empresas mais próximas de 106,5, por exemplo, como eu faria isso?

Se eu fizer

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

por exemplo, ou se eu fizer

SELECT *
FROM Business
TOP 20

Em teoria o computador terá que computar distância para todos os biz enquanto na prática apenas aqueles com latitude e longitude dentro de uma certa faixa que deve ser computada.

Então, como posso fazer o que quero em PhP ou SQL, por exemplo?

Estou grato com a resposta até agora. Estou usando mysql e eles não tem nada mais eficiente que a solução óbvia. O MySQL espacial também não possui função de cálculo de distância.

optimization mysql-5.5
  • 3 3 respostas
  • 4117 Views

3 respostas

  • Voted
  1. Best Answer
    Jack Douglas
    2011-08-01T23:05:30+08:002011-08-01T23:05:30+08:00

    Se eu entendi a pergunta corretamente (e não tenho certeza), você está preocupado em calcular "(Some formula to compute distance here)"cada linha da tabela toda vez que faz uma consulta?

    Isso pode ser mitigado até certo ponto usando os índices on latitudee longitude, portanto, só precisamos calcular a distância para uma 'caixa' de pontos contendo o 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
    

    Onde 96, 116 etc são escolhidos para corresponder à unidade do valor '2000' e ao ponto no globo a partir do qual você está calculando as distâncias.

    A precisão com que isso usa índices dependerá do seu RDBMS e das escolhas feitas por seu planejador.

    Em termos gerais, esta é uma forma primitiva de otimizar uma espécie de busca do vizinho mais próximo . Se o seu RDBMS oferece suporte a índices GiST , como postgres , considere usá-los.

    • 8
  2. Brent Ozar
    2011-08-02T03:54:21+08:002011-08-02T03:54:21+08:00

    (Divulgação: sou um cara do Microsoft SQL Server, então minhas respostas são influenciadas por isso.)

    Para realmente fazer isso com eficiência, há duas coisas que você deseja: armazenamento em cache e suporte a dados espaciais nativos. O suporte a dados espaciais permite armazenar dados geográficos e geométricos diretamente no banco de dados sem fazer cálculos intensivos/caros em tempo real e permite criar índices para encontrar rapidamente o ponto mais próximo de sua localização atual (ou rota mais eficiente ou qualquer outra).

    O armazenamento em cache é importante se você deseja dimensionar, ponto final. A consulta mais rápida é aquela que você nunca faz. Sempre que um usuário pede as coisas mais próximas a ele, você armazena sua localização e o conjunto de resultados em um cache como Redis ou memcached por um período de horas. Os locais das empresas não vão mudar por 4 horas - bem, eles podem mudar se alguém editar uma empresa, mas você não precisa necessariamente que isso seja atualizado imediatamente em todos os conjuntos de resultados.

    • 6
  3. Evan Carroll
    2018-06-22T21:24:07+08:002018-06-22T21:24:07+08:00

    Yelp provavelmente usa GIS

    PostgreSQL tem a implementação de referência para GIS com PostGIS . O Yelp pode estar usando o MySQL, que é inferior em todos os aspectos . No caso de algo como o Yelp, eles quase certamente mantêm as coordenadas para,

    • O usuário
    • Os destinos potenciais

    Essas coordenadas quase certamente estão em WGS84 e armazenadas como tipo Geografia. No PostgreSQL e no PostGIS, seria mais ou menos assim,

    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;
    

    Eles encheriam aquela mesa. Em seguida, eles pegam as coordenadas WGS84 do seu telefone e geram uma consulta, como esta com o SQL Alchemy (no caso do Yelp),

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

    Para obter mais informações, consulte nosso espacial e confira Geographic Information Systems @ StackExchange

    • 0

relate perguntas

  • Evento MySQL não é executado

  • Otimização de consultas

  • Como devo otimizar o armazenamento para esta tabela?

  • DBMS_REDEFINITION vs EXCHANGE PARTITION no oracle

  • Existe uma boa "regra de ouro" para traduzir o custo EXPLAIN para o tempo de execução (relógio de parede)?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve