Sim, você pode criar uma função armazenada para essa finalidade. Algo assim:
DELIMITER //
DROP FUNCTION IF EXISTS Haversine //
CREATE FUNCTION Haversine
( myLat FLOAT
, myLong FLOAT
, db_lat FLOAT
, db_long FLOAT
, unit VARCHAR(20)
)
RETURNS FLOAT
DETERMINISTIC
BEGIN
DECLARE haver FLOAT ;
IF unit = 'MILES' --- calculations
SET haver = ... --- calculations
RETURN haver ;
END //
DELIMITER ;
Não acho que ofereça ganhos de velocidade, mas é bom por todos os outros motivos que você menciona:Legibilidade, reutilização, facilidade de manutenção (imagine que você encontre um erro após 2 anos e precise editar o código em algumas (algumas) centenas lugares).