Newto
@Newto

Как ускорить запрос с ST_Distance_Sphere?

Добрый день.

Есть таблица
`table` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `latitude` decimal(18,15) DEFAULT NULL,
  `longitude` decimal(18,15) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_geo` (`latitude`,`longitude`)
) ENGINE=MyISAM AUTO_INCREMENT=100000 DEFAULT CHARSET=utf8;


И есть запрос
SELECT 
    `id`
FROM
    `table`
WHERE
ST_Distance_Sphere(POINT(`longitude`, `latitude`), POINT(30.36082, 59.93107)) <= 7000 OR ....и тут еще подобных ST_Distance_Sphere штук сто....


Отрабатывает этот запрос долго, ~секунд 20, и explain показывает, что индекс не используется(key и possible keys пустые).
Возможно ли и если да то как использование индекса в таком запросе?

Заранее спасибо за ответы.
  • Вопрос задан
  • 71 просмотр
Пригласить эксперта
Ответы на вопрос 1
mrMazai
@mrMazai
WebDeveloper
Я тут вижу костылик, если вы ограничены в области выборки, то часть вопросов можно снять проиндексировав поля `longitude`, `latitude` и пред ST_Distance_Sphere делать WHERE BETWEEN `longitude`, BETWEEN `latitude`. И ограничить поле рассчитывая необхордимое количество градусов в одном градусе меридиана 111 км, а с параллелями надо мудрить в зависимости от широты. Вот код из примеров, немного криво, но работает и индексы использует:
SELECT
  id
FROM
  table
WHERE latitude  BETWEEN 50 AND 60
AND  longitude BETWEEN 35 AND 45
AND
  (
    ST_Distance_Sphere(
      point(latitude, longitude),
      point(55.741983, 37.638983)
    ) 
  ) <= 10000


Таким образом можно ограничить область выборки условным квадратом 1000х1000 км, что отсечет не подходящие координаты и ускорит выполнение запроса. Или думать в сторону PosgreSQL
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы