Можно ли оптимизировать этот подзапрос MySQL? - PullRequest
1 голос
/ 28 марта 2010

У меня есть две таблицы: новости и новости. Каждый раз при просмотре статьи идентификатор новости, IP-адрес и дата записываются в news_views.

Я использую запрос с подзапросом для извлечения наиболее просматриваемых заголовков из новостей, получая общее количество просмотров за последние 24 часа для каждого.

Он работает нормально, за исключением того, что для его запуска требуется от 5 до 10 секунд, предположительно потому, что в news_views есть сотни тысяч строк, и он должен пройти всю таблицу, прежде чем завершится. Запрос выглядит следующим образом: можно ли вообще его улучшить?

SELECT n.title
,      nv.views
FROM   news n
LEFT
JOIN   (
       SELECT news_id
       ,      count( DISTINCT ip ) AS views
       FROM   news_views
       WHERE  datetime >= SUBDATE(now(), INTERVAL 24 HOUR)
       GROUP
       BY     news_id
       ) AS nv
ON     nv.news_id = n.id
ORDER
BY     views DESC
LIMIT  15

1 Ответ

2 голосов
/ 28 марта 2010

Не думаю, что вам нужно рассчитывать количество просмотров как производную таблицу:

SELECT n.id, n.title, count( DISTINCT nv.ip ) AS views
FROM   news n
LEFT JOIN news_views nv  
ON nv.news_id = n.id
WHERE nv.datetime >= SUBDATE(now(), INTERVAL 24 HOUR)
GROUP BY n.id, n.title
ORDER BY views DESC LIMIT  15

Лучший совет здесь состоит в том, чтобы выполнить эти запросы через EXPLAIN (или любой другой эквивалент mysql), чтобы увидеть, что запрос на самом деле будет делать - сканирование индекса, сканирование таблицы, расчетные затраты и т. Д. Избегайте полного сканирования таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...