Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta de resultados de pesquisa baseada em localização lenta


Você pode usar a extensão espacial mysql e salvar a latitude e longitude como um tipo de dados de ponto e torná-lo um índice espacial. Dessa forma, você pode reordenar as coordenadas ao longo de uma curva e reduzir a dimensão e preservar as informações espaciais. Você pode usar o índice espacial como uma caixa delimitadora para filtrar a consulta e, em seguida, usar a fórmula harvesine para escolher o resultado ideal. Sua caixa delimitadora deve ser maior que o raio do grande círculo. Mysql usa um rtree com algum índice espacial e meu exemplo foi sobre uma curva z ou uma curva de hilbert: https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .Em seguida, você pode inserir uma geocoordenada diretamente em uma coluna de ponto:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Ou você pode usar um tipo de dados de geometria:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Então você pode usar a função MBRcontains assim: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html ou quaisquer outras funções:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Portanto, você precisa de uma caixa delimitadora. Aqui estão alguns exemplos:

Aqui está um exemplo simples com tipo de dados de ponto:
    CREATE SPATIAL INDEX sx_place_location ON place (location)

    SELECT  * FROM    mytable
    WHERE   MBRContains
           (
           LineString
                   (
                   Point($x - $radius, $y - $radius),
                   Point($x + $radius, $y + $radius)
                   )
           location
           )
    AND Distance(Point($x, $y), location) <= $radius

Não tenho certeza se funciona porque usa uma variável de raio com uma função de caixa delimitadora. Parece-me que o MBRwithin é um pouco mais simples, porque não precisa de nenhum argumento:Mysql:Otimizando a localização de super nó na árvore de conjuntos aninhados .