Propongo una forma más rápida.
Obtener el número de filas:
SELECT CEIL(COUNT(*)/2) FROM data;
Luego tome el valor medio en una subconsulta ordenada:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Probé esto con un conjunto de datos de números aleatorios de 5x10e6 y encontrará la mediana en menos de 10 segundos.
Esto encontrará un percentil arbitrario al reemplazar el COUNT(*)/2
con COUNT(*)*n
donde n
es el percentil (0,5 para la mediana, 0,75 para el percentil 75, etc.).