sql >> Databáze >  >> RDS >> Mysql

MYSQL Geo Search s výkonem na dálku

Nejrychlejší způsob, jak toho dosáhnout, je použít geoprostorová rozšíření pro MySQL, což by mělo být dostatečně snadné, protože již používáte tabulku MyISAM. Dokumentaci k těmto rozšířením naleznete zde:http:/ /dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html

Přidejte nový sloupec s datovým typem POINT:

ALTER TABLE `adverts` 
ADD COLUMN `geopoint` POINT NOT NULL AFTER `longitude`
ADD SPATIAL KEY `geopoint` (`geopoint`)

Poté můžete tento sloupec vyplnit ze svých stávajících polí zeměpisné šířky a délky:

UPDATE `adverts` 
SET `geopoint` = GeomFromText(CONCAT('POINT(',`latitude`,' ',`longitude`,')'));

Dalším krokem je vytvoření ohraničujícího rámečku na základě vstupní zeměpisné šířky a délky, které budou použity ve vašem WHERE klauzule jako CONTAINS omezení. Budete muset určit sadu X,Y POINT souřadnice, které vyhovují vašim požadavkům na základě požadované oblasti vyhledávání a daného výchozího bodu.

Váš poslední dotaz bude hledat všechny POINT data, která jsou ve vašem vyhledávání POLYGON a poté můžete použít výpočet vzdálenosti k dalšímu upřesnění a třídění dat:

SELECT a.*, 
    ROUND( SQRT( ( ( (adverts.latitude - '53.410778') * (adverts.latitude - '53.410778') ) * 69.1 * 69.1 ) + ( (adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53 ) ), 1 ) AS distance
FROM adverts a
WHERE a.type_id = 3
AND CONTAINS(a.geopoint, GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'))
HAVING distance < 25
ORDER BY distance DESC
LIMIT 0, 30

Všimněte si, že GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))') ve výše uvedeném nebude fungovat , budete muset nahradit souřadnice platnými body kolem začátku vyhledávání. Pokud očekáváte, že se šířka/délka změní, měli byste zvážit použití spouštěče pro zachování POINT data a související SPATIAL KEY aktuální. U velkých datových sad byste měli vidět výrazně lepší výkon oproti výpočtu vzdálenosti pro každý záznam a filtrování pomocí HAVING doložka. Osobně jsem definoval funkce pro použití při určování vzdálenosti a vytváření ohraničujícího POLYGON .



  1. Výstup MYSQL ve stromovém formátu NEBO Přidání úrovně (rodič-dítě)

  2. Parser pro Oracle SQL

  3. pgAdmin III Proč jsou výsledky dotazů zkráceny?

  4. Rozšířené SQL:Vložení výstupu parametrizované funkce s hodnotou tabulky do tabulky SQL