Похоже, что это расчетное значение имеет внутреннее значение в вашей области бизнеса; если это так, я бы рассчитал его один раз (например, во время создания записи) и использовал бы его, как любое обычное поле. Это, безусловно, самый эффективный способ достижения того, чего вы хотите - дополнительные вычисления при вставке или обновлении оказывают минимальное влияние на производительность, и с этого момента вам не нужно беспокоиться о том, кто и где выполняет вычисления.
Недостатком является то, что вам необходимо обновить логику «вставки» и «обновления» для выполнения этого вычисления. Мне обычно не нравятся триггеры - они могут быть источником непроницаемых ошибок - но это тот случай, когда я их рассмотрю (http://dev.mysql.com/doc/refman/5.0/en/triggers.html).
Если по какой-то причине вы не можете этого сделать, я бы предложил сделать это на сервере базы данных. Это должно быть довольно быстро, если вы не имеете дело с очень большим количеством записей; в этом случае «упорядочить по» будет реальной проблемой производительности. Конечно, проблема производительности будет гораздо большей, если вы выполните ту же логику на стороне PHP, но ваша база данных, как правило, является узким местом с точки зрения производительности, поэтому влияние будет больше.
Если вы имеете дело с большим количеством записей, вам, возможно, придется просто укусить пулю и пойти с моим первым предложением.
Если бы не необходимость сортировки по вычислениям, вы также можете сделать это на стороне PHP; однако, сортировка массива в PHP - это не то, что я хотел бы сделать для больших наборов результатов, и, кажется, расточительно не выполнять сортировку в базе данных (что хорошо в этом роде).
Итак, после всего этого мой реальный совет сводится к:
- сделать самое простое, что могло бы сработать
- проверить, достаточно ли это быстро в пределах ограничений вашего
Проект
- если нет, то итеративный рефакторинг для более быстрого решения, повторное тестирование
- Как только вы достигнете "достаточно хорошо", двигайтесь дальше.
На основе редактировать 1 :
Я думаю, что вы ответили на свой вопрос - возвращать (в конечном итоге) 2 миллиона строк в PHP, только чтобы найти 20 лучших записей (после расчета их «значения» по одной), будет невероятно медленно. Так что вычисление в PHP на самом деле не вариант.
Итак, вы будете рассчитывать его на сервере. Я бы порекомендовал создать представление (http://dev.mysql.com/doc/refman/5.0/en/create-view.html), в котором есть SQL для выполнения расчета; сравните производительность представления с записями 200, 200K и 2M и посмотрите, достаточно ли это быстро.
Если это не достаточно быстро для 2M пользователей / записей, вы всегда можете создать обычную таблицу с индексом в столбце «значение», и в вашем клиентском коде сравнительно мало изменений; Вы можете заполнить новую таблицу с помощью триггеров, и клиентский код может никогда не узнать, что произошло.