Jag föreslår ett snabbare sätt.
Få radantalet:
SELECT CEIL(COUNT(*)/2) FROM data;
Ta sedan mittvärdet i en sorterad underfråga:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Jag testade detta med en datauppsättning på 5x10e6 med slumpmässiga tal och den kommer att hitta medianen på under 10 sekunder.
Detta kommer att hitta en godtycklig percentil genom att ersätta COUNT(*)/2
med COUNT(*)*n
där n
är percentilen (0,5 för median, 0,75 för 75:e percentilen, etc).