Proponuję szybszy sposób.
Uzyskaj liczbę wierszy:
SELECT CEIL(COUNT(*)/2) FROM data;
Następnie weź środkową wartość w posortowanym podzapytaniu:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Przetestowałem to z zestawem danych losowych liczb 5x10e6 i znajdź medianę w mniej niż 10 sekund.
Spowoduje to znalezienie dowolnego percentyla poprzez zastąpienie COUNT(*)/2
z COUNT(*)*n
gdzie n
to percentyl (0,5 dla mediany, 0,75 dla 75 percentyla itd.).