То, что вы ищете, ИМХО, это способ получить лучших K элементов в (теоретически) бесконечном потоке элементов.
Я бы не пытался решить эту проблему напрямую в mysql, поскольку ваш ввод - это поток, а не фиксированный набор данных.Кроме того, учитывая размер набора данных, пересчет верхнего K с нуля на каждой вставке не подлежит сомнению.
Что я хотел бы сделать, это иметь компактное представление верхнего K, которое вы обновляете по мере поступления новых элементов.каждый элемент, возьмите его счет и сохраните кучу лучших K элементов, которые вы видели до сих пор.
Немного более формально: дан поток данных q1,.,,, qn, добавьте qj в кучу, если оценка (qj) больше, чем наименьшая оценка в куче.В этом случае наименьший оценочный балл должен быть удален из кучи.
Конкретное решение
У вас есть несколько столбцов баллов, и пользователь может запросить верхние 450 для любой комбинации столбцов, используядиапазон запросов.
Концептуально я хотел бы сделать следующее:
- сохранить топ 450 в куче для каждого столбца оценки отдельно, используя потоковый подход, описанный выше
- во время запроса получите элементы, которые соответствуют запросу по столбцам
- , агрегируйте и сортируйте списки по мере необходимости, а затем сокращайте до 450
Надеюсь, это поможет.