2016-01-21 1 views
0

Я хочу отобразить 10 тем форума, посвященного vbulletin, на который было больше всего ответов на этой неделе. Поэтому я написал запрос, чтобы сосчитать все сообщения в виде временного интервала, сгруппированных по ThreadID, чтобы убедиться, что каждая нить только один раз в этом списке:MySQL Получить ответы на все темы в X дней Присоединить потоки займет около 1 секунды

SELECT post.postid, COUNT(post.postid) AS replys 
FROM post 
WHERE post.visible = 1 
AND post.dateline > DATE_SUB("2016-01-21", INTERVAL - 7 DAY) 
GROUP BY post.threadid 
ORDER BY replys DESC, post.dateline DESC 
LIMIT 10 

Этот запрос заняла около 0,3 секунды на базу данных, где сообщений имеют около 400 000 строк и нитей около 40 000 строк, что кажется немного длинным, но все же приемлемым - также потому, что оно может быть кэшировано.

Но я также необходима некоторая информация о нити таблицы подобно Titel, которая требует объединения:

SELECT post.postid, COUNT(post.postid) AS replys, 
thread.title, thread.views, thread.replycount 
FROM post 
INNER JOIN thread ON(thread.threadid = post.threadid) 
WHERE post.visible = 1 
AND post.dateline > DATE_SUB("2016-01-21", INTERVAL - 7 DAY) 
GROUP BY post.threadid 
ORDER BY replys DESC, post.dateline DESC 
LIMIT 10 

Теперь мой запрос о 1 Наталья принимает второй, который является довольно слишком много! Что я могу сделать, чтобы сделать запрос быстрее?

Информация о структуре таблиц:

сообщение

enter image description here enter image description here

Thread

enter image description here enter image description here

ответ

2

Это предложение может показаться странным, но это помогло мне довольно часто: используйте подзапрос.

Сначала просто сделайте подсчет и уменьшите количество полей, участвующих в этом запросе, до минимума. Ваш подзапрос должен возвращать только счетчики и идентификатор, которые применимы для получения всех других данных (скорее всего, это будет threadid).

Затем присоедините результат и получите остальную информацию.

Я не удивлюсь, если это спасет вас полсекунды.

Смежные вопросы