Я предлагаю более быстрый способ.
Получить число строк:
SELECT CEIL(COUNT(*)/2) FROM data;
Затем взять среднее значение в отсортированном подзапросе:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Я проверил это с набором данных 5x10e6 случайных чисел, и он найдет медиану менее чем за 10 секунд.