MYSQL Geo Search с показателями расстояния

У меня есть запрос выбора mysql для поиска на моем веб-сайте, который испытывает проблемы с производительностью, когда сайт действительно загружен. Приведенный ниже запрос ищет объявления из таблицы с более чем 100 тыс. Записей, в пределах 25 миль от заданного широты и долготы, и сортирует по расстоянию. Количество миль может отличаться в зависимости от выбранного пользователем.

Проблема в том, что я думаю, что это медленно, потому что он выполняет вычисления для всех записей в таблице, а не для тех, которые находятся в пределах 25 миль от широты и долготы. Можно ли изменить этот запрос так, чтобы пункт where выбирал только рекламу в пределах 25 миль? Я читал о ограничивающих прямоугольниках и пространственных индексах, но не уверен, как применить их к этому запросу. Нужно ли добавлять предложение where, которое выбирает записи с радиусом 25 миль в широте и долготе, как мне это сделать?

SELECT 
    adverts.*, 
    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
WHERE 
    (adverts.type_id = '3')
HAVING 
    DISTANCE < 25
ORDER BY 
    distance ASC 
LIMIT 120,10

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

CREATE TABLE `adverts` (
`advert_id` int(10) NOT NULL AUTO_INCREMENT,
`type_id` tinyint(1) NOT NULL,
`headline` varchar(50) NOT NULL,
`description` text NOT NULL,
`price` int(4) NOT NULL,
`postcode` varchar(7) NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
PRIMARY KEY (`advert_id`),
KEY `latlon` (`latitude`,`longitude`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

когда я делаю объяснение в операторе mysql, число строк устанавливается равным 67900, что намного больше, чем в радиусе 25 миль, также дополнительно устанавливается значение & quot; Использование где; Использование файловой сортировки & quot ;.

Запрос занимает 0,3 секунды, что очень медленно, особенно когда веб-сайты получают много запросов в секунду.

Ответы на вопрос(2)

Ваш ответ на вопрос