mysql — «трендовая» функция в стиле reddit / проблемы с производительностью hackernews

#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))