Мне нужно найти способ эффективно обрабатывать большой объем данных в PHP / MySQL. Вот ситуация:
У меня есть таблица базы данных с, скажем, миллионом записей. Основываясь на пользовательском входе от PHP, мне нужно ранжировать все эти миллионы записей в соответствии с нетривиальным шагом вычисления, чтобы я мог выбрать верхние скоринговые элементы. Моя проблема в том, что это очень мало оценивается с точки зрения использования памяти, особенно на этапе сортировки, если я переупорядочу данные в столбцы и использую array_multisort.
Альтернативные методы, о которых я могу думать, это:
Это должно быть довольно распространенной проблемой для таких вещей, как поисковые системы. Масштабируемость является приоритетом номер один, но производительность также должна быть очень хорошей. Является ли один из этих подходов лучшим, или есть еще один отличный вариант, который я даже не рассматриваю?
Предполагая, что ваш набор данных слишком велик для хранения в памяти. Если вам нужны только первые n элементов, вы можете сохранить только верхние результаты в памяти при прохождении через 1 миллион строк. Это также будет работать с вашей временной табличной идеей, написав верхние записи из каждой партии.
Другой вариант – написать определенную пользователем функцию:
http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html
Почему бы не выполнить часть или все ваши вычисления при сохранении строки. Таким образом, вам нужно только сделать это один раз, и у вас есть много времени, чтобы сделать это.
Выполнение этого в сложном ORDER BY является лучшим из всех вариантов, о которых вы упомянули, если это возможно. Но за миллион записей вы все равно столкнетесь с проблемами.
Похоже, вы делаете что-то тяжело, пытаясь сохранить все свои данные в одном месте и заказать его на лету. Нет ли способа сделать предварительный подсчет очков, даже если это несколько баллов, которые вы комбинируете во время запроса для настраиваемого ключа сортировки?
Насколько сложны запросы пользователя? Если вы пытаетесь выполнить полнотекстовый поиск, вы должны получить программное обеспечение, специализирующееся на этой задаче.