MYSQL Geo Search tendo desempenho à distância

Eu tenho uma declaração mysql select para uma pesquisa no meu site que está tendo problemas de desempenho quando o site fica muito ocupado. A consulta abaixo pesquisa anúncios de uma tabela com mais de 100 mil registros, a menos de 40 km do lat e lon e classifica por distância. O número de milhas pode diferir conforme selecionado pelo usuário.

O problema é que eu acho que é lento porque faz os cálculos para todos os registros na tabela, em vez daqueles que estão dentro de 25 milhas do lat e lon. É possível alterar essa consulta para que a cláusula where selecione somente anúncios dentro de 25 milhas? Eu li sobre índices de caixa delimitadora e espacial, mas não tenho certeza como aplicá-los a esta consulta, eu preciso adicionar uma cláusula where que seleciona registros raio de 25 milhas do lat e lon, como faço isso?

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

Edit: Atualizado para incluir o esquema da tabela, por favor, note que a tabela é mais complicada e por isso é a consulta, mas eu removi as coisas que não são necessárias para este problema.

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

Quando eu faço uma explicação sobre a instrução mysql o número de linhas é definido para 67900, que é muito mais do que está em um raio de 25 milhas, também o extra é definido como "Usando onde; Using filesort".

A consulta leva 0,3 segundos, o que é muito lento, especialmente quando os sites recebem muitas solicitações por segundo.

questionAnswers(2)

yourAnswerToTheQuestion