Mysql
 sql >> база данни >  >> RDS >> Mysql

MYSQL Geo Search има ефективност от разстояние

Най-бързият начин да направите това е да използвате геопространствените разширения за MySQL, което трябва да е достатъчно лесно, тъй като вече използвате MyISAM таблица. Документацията за тези разширения може да бъде намерена тук:http:/ /dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html

Добавете нова колона с тип данни POINT:

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

След това можете да попълните тази колона от съществуващите си полета за географска ширина и дължина:

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

Следващата стъпка е да създадете ограничаваща кутия въз основа на въведените ширина и дължина, които ще бъдат използвани във вашия WHERE клауза като CONTAINS ограничение. Ще трябва да определите набор от X,Y POINT координати, които работят за вашите изисквания въз основа на желаната област за търсене и дадена начална точка.

Вашата последна заявка ще търси всички POINT данни, които са във вашето търсене POLYGON , и след това можете да използвате изчисление на разстоянието, за да прецизирате и сортирате данните си:

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

Обърнете внимание, че GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))') в горното няма дасработи , ще трябва да замените координатите с валидни точки около началото на вашето търсене. Ако очаквате lat/long да се промени, трябва да помислите за използването на тригер, за да запазите POINT данни и свързания SPATIAL KEY актуална. С големи набори от данни трябва да видите значително подобрена производителност спрямо изчисляване на разстояние за всеки запис и филтриране с помощта на HAVING клауза. Аз лично дефинирах функции за използване при определяне на разстоянието и създаване на ограничаващ POLYGON .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избягване на вложени заявки

  2. Преобразувайте избраните стойности на колона в друг ред, като използвате select със същия идентификатор part2

  3. Как да получа имена на колони в Laravel 4?

  4. MySQL подрежда публикации по последен коментар ИЛИ последно публикуван

  5. Броят на колоните на mysql.user е грешен. Очаквано 42, намерено 44. Вероятно таблицата е повредена