Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оптимизация БД форума

86K
15 января 2013 года
new_saler
3 / / 15.01.2013
Нужны практические советы по оптимизации структцры БД форума.
Возможно советы из этой темы пригодятся кому-то еще.
-------------------------------------------------------
В бд форума есть основные таблицы:
1. USERS: id_user, username, passw, count_post.
2. POSTS: id_post, id_topic, id_poster, name_poster, date_time_post, post_text.
3. TOPICS: id_topic, id_razdel, title_lopic, id_author, name_author, last_post_id, last_poster_id, last_poster_name, date_time_last_post, count_posts.
4. RAZDEL: id_razdel, title_razdel.

Заранее хочу оптимизировать структуру БД под довольно большую нагрузку: 5-8 млн.сообщений, 300-500 тыс. тем, 30-50 тыс. хостов в день и около 200-300 тыс. просмотров в день. В онлайне постоянно 300-800 человек.
-------------------------------------------------------
При добавлении юзером сообщения оно добавляется в таблицу POSTS, одновременно в таблице USERS обновляется поле count_post, а так же в таблице TOPICS обновляются поля: last_post_id, last_poster_id, last_poster_name, date_time_last_post, count_posts.

Мне нужно сделать запрос на формирование главной страницы форума (например как на форуме sqlinfo.ru).
То есть нужно вытащить название раздела, количество тем и сообщений в разделе, автора и время последнего поста в разделе.
Сначала планировал сделать так:
1. Первым запросом запрашиваю из таблицы RAZDEL название разделов.
2. Из TOPICS запрашиваю все поля для тем, сгруппировав по разделам и найдя для каждого раздела тему с максимальным last_post_id.
То есть у меня будет для каждого раздела вытянуты параметры темы в которой написано последнее сообщение в разделе:
SELECT t1.id_topic, t1.title_topic, t1.id_author, t1.name_author, t1.last_post_id, t1.last_poster_id, t1.last_poster_name, t1.date_time_last_post
FROM TOPICS t1
WHERE t1.last_post_id = ( SELECT t2.last_post_id
FROM TOPICS t2
WHERE t2.id_razdel = t1.id_razdel
ORDER BY t2.last_post_id DESC LIMIT 1 )
ORDER BY t1.last_post_id DESC;
3. Третьим запросом вытаскиваю с помощью GROUP BY количество тем и постов для каждого раздела.

Теперь появилась идея: в таблицу RAZDEL добавить поля: last_post_id, last_poster_id, last_poster_name, date_time_last_post, count_posts, count_topics.
Терерь при добавлении юзером сообщения, оно добавляется в таблицу POSTS, одновременно в таблице USERS обновляется поле count_post, в таблице TOPICS обновляются поля: last_post_id, last_poster_id, last_poster_name, date_time_last_post, count_posts,
в таблице RAZDEL обновляются поля: last_post_id, last_poster_id, last_poster_name, date_time_last_post, count_posts. И при создании темы обновляется count_topics.

Теперь одним простым запросом можно сформировать главную страницу.

Что с точки зрения оптимальности лучше сделать: первый вариант или второй (догадываюсь, что второй).
Но вот не слишком ли много АПДЕЙТОВ в 3-х таблицах при добавлении одного поста при довольно частом постинге и активном чтении форума пользователями? Не будет ли при многочисленных апдейтах тормозить сервер в моём случае при такой нагрузке?
67K
15 января 2013 года
caballero
19 / / 25.09.2011
раслабся, с твоими знаниями не делаются сайты с такой нагрузкой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог