#mysql #sql #doctrine-orm
#mysql #sql #доктрина-orm
Вопрос:
У меня есть таблица сообщений, которые я хотел бы упорядочить, используя функцию, аналогичную функции hacker news или reddit — значения «нравится — не нравится» и новизна. Проблема: это очень медленно (хотя все соответствующие поля проиндексированы). Как я могу ускорить это?
Запрос (псевдо):
SELECT * FROM Post WHERE foo = 'bar' ORDER BY
((p.like_count - p.dislike_count) / POW(((UNIX_TIMESTAMP(NOW()) - p.time / 3600) 2, 1.5))
Мой первый инстинкт — попытаться вычислить UNIX_TIMESTAMP(NOW()) вне запроса, хотя я также не знаю, как выглядит производительность POW() .
Комментарии:
1. Сможете ли вы опубликовать
EXPLAIN
выходные данные для своего запроса? т.е. выполнитьEXPLAIN SELECT * FROM ..... etc
2. Вы могли бы заменить
POW(x, 1.5)
наSQRT(x * x * x)
, но я сомневаюсь, что это имеет какое-либо значение.
Ответ №1:
Решение, которое я в итоге использовал, состояло в том, чтобы полностью отбросить сообщения старше пары недель. Поскольку trending интересует только недавний контент, ему не нужно извлекать информацию из архивов истории.
$oldestAllowed = time() - 3600*24*14; // 14 days
SELECT * FROM Post WHERE p.time > $oldestAllowed ORDER BY
((p.like_count - p.dislike_count) / POW(((UNIX_TIMESTAMP(NOW()) - p.time / 3600) 2, 1.5))