2012-04-27 5 views
1

У меня есть форум, на котором есть название темы, количество сообщений и другая информация. Мне удалось оптимизировать другие запросы/удалить их полностью, но тот, который учитывает количество сообщений каждого потока, замедляет загрузку основной страницы.Подсчитайте количество сообщений на форуме

т.е. echo $boards->getPostCount($thread)

внутри getPostCount($thread) всего: $query = $this->db->query("SELECT COUNT(id) FROM forum_posts WHERE threadid = '$thread'

Это проблема, потому что он должен делать это для каждого потока и есть 20 нитей на странице.

Есть ли другой способ получить эту информацию заранее или как-то минимизировать запросы, необходимые для получения этой информации? В настоящее время в настоящее время насчитывается 150 пользователей, поэтому 3K запросов на загрузку страницы - это не то, что я хочу.

Спасибо.

Изменить: EXPLAIN запроса я был дан использовать: mysql explain http://screensnapr.com/e/01hulx.png

ответ

0

Использование присоединяется:

SELECT t.*, COUNT(fp.id) 
FROM threads t 
LEFT JOIN 
     forum_posts fp 
ON  fp.threadid = t.id 
ORDER BY 
     t.last_updated DESC 
LIMIT 20 

Однако, это все еще требует двигатель сосчитать сообщения для каждого потока на каждой перезагрузки.

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

+0

Я пробовал это раньше, и выполнение такого запроса в основном убивает MySQL, и навсегда требуется возврат к результату. Итак, я не знаю, что-то не так с mysql или слишком большое количество сообщений (300 тыс. Сообщений, потоки 34 тыс.). – Steve

+0

Я добавил соответствующие отношения между потоками и столбиком, и все прошло гладко. – Steve

+0

@Tar: Создайте индекс на 'forum_threads (boardid, sticky, lastbump)' и еще один на 'forum_posts (threadid)'. – Quassnoi

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