Sí, puede crear una función almacenada para este propósito. Algo como esto:
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 ;
No creo que ofrezca ganancias de velocidad, pero es bueno por todas las otras razones que mencionas:legibilidad, reutilización, facilidad de mantenimiento (imagina que encuentras un error después de 2 años y tienes que editar el código en unos (unos) cientos lugares).