Tôi đề xuất một cách nhanh hơn.
Nhận số lượng hàng:
SELECT CEIL(COUNT(*)/2) FROM data;
Sau đó, lấy giá trị giữa trong một truy vấn con được sắp xếp:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Tôi đã thử nghiệm điều này với tập dữ liệu 5x10e6 gồm các số ngẫu nhiên và nó sẽ tìm ra giá trị trung bình trong vòng chưa đầy 10 giây.
Điều này sẽ tìm thấy một phân vị tùy ý bằng cách thay thế COUNT(*)/2
với COUNT(*)*n
ở đâu n
là phân vị (.5 cho trung vị, .75 cho phân vị thứ 75, v.v.).