База данных: лучший способ выполнить запрос данных о географическом местоположении? - PullRequest
38 голосов
/ 28 ноября 2009

У меня есть база данных MySQL. Я храню дома в базе данных и выполняю буквально всего 1 запрос к базе данных, , но мне нужно, чтобы этот запрос выполнялся очень быстро , и это возвращает все дома в квадрате широта и долгота.

SELECT * FROM homes 
WHERE geolat BETWEEN ??? AND ???
AND geolng BETWEEN ??? AND ???

Как мне лучше всего сохранить свои геоданные, чтобы я мог выполнить этот запрос, чтобы быстрее отобразить все дома в окне геолокации?

В основном:

  • Использую ли я лучший оператор SQL для выполнения этого запроса быстрее всего?
  • Существует ли какой-либо другой метод, может быть, даже не использующий базу данных, чтобы я мог быстрее всего запросить результат поиска домов в пределах границ геолокации в штучной упаковке?

На случай, если это поможет, я включу следующую схему таблицы базы данных:

CREATE TABLE IF NOT EXISTS `homes` (
  `home_id` int(10) unsigned NOT NULL auto_increment,
  `address` varchar(128) collate utf8_unicode_ci NOT NULL,
  `city` varchar(64) collate utf8_unicode_ci NOT NULL,
  `state` varchar(2) collate utf8_unicode_ci NOT NULL,
  `zip` mediumint(8) unsigned NOT NULL,
  `price` mediumint(8) unsigned NOT NULL,
  `sqft` smallint(5) unsigned NOT NULL,
  `year_built` smallint(5) unsigned NOT NULL,
  `geolat` decimal(10,6) default NULL,
  `geolng` decimal(10,6) default NULL,
  PRIMARY KEY  (`home_id`),
  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
) ENGINE=InnoDB  ;

UPDATE

Я понимаю, что пространственная воля будет влиять на кривизну Земли, но меня больше всего интересует возвращение геоданных как можно быстрее. Если эти пакеты пространственной базы данных не возвращают данные быстрее, не советуйте пространственные расширения. Спасибо

ОБНОВЛЕНИЕ 2

Пожалуйста, обратите внимание, что никто из нижеприведенных действительно не ответил на вопрос. Я действительно с нетерпением жду любой помощи, которую я мог бы получить. Заранее спасибо.

Ответы [ 11 ]

0 голосов
/ 28 ноября 2009

Это выглядит довольно быстро. Единственное, что меня беспокоит, - это использовать индекс для получения всех значений в пределах 3 миль от широты, а затем отфильтровать их для значений в пределах 3 миль от долготы. Если я понимаю, как работает базовая система, вы можете использовать только один ИНДЕКС для каждой таблицы, поэтому индекс лат или лонг ничего не стоит.

Если у вас большой объем данных, он может * ускорить ускорения, чтобы дать каждому квадрату 1x1 мили уникальный логический идентификатор, а затем наложить дополнительное ограничение на SELECT, что (area = "23234 / 34234 "ИЛИ площадь =" 23235/34234 "ИЛИ ...) для всех квадратов вокруг вашей точки, затем вынудите базу данных использовать этот индекс, а не широту и долготу. Тогда вы будете фильтровать только гораздо меньше квадратных миль данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...