Forum Webscript.Ru

Общие => Базы данных => Тема начата: Rodent от 07 Января 2006, 15:41:09

Название: Проектирование форума
Отправлено: Rodent от 07 Января 2006, 15:41:09
Доброе время суток.
У меня тут возникли небольшие трудности с выполнением скрпита, который вытаскивает дату и имя пользователя последнего поста в теме. Т.е. сортировка тем форума по дате последнего поста: выводим имя форума, дата последнего поста, имя автора последнего поста.


SELECT t1.* , max( t2.date ) AS last, MAX( t2.pid ) AS older, t3.*, count(*)
FROM `we_topics` AS t1, `we_posts` AS t2, `we_posts` AS t3
WHERE t1.forum_id = \'$id\' AND t1.tid = t2.topic_id
GROUP BY t1.tid, t3.pid
HAVING t3.pid = older
ORDER BY t1.position desc, last DESC
LIMIT $from, $maxmess";


Что к чему относиться интуинтивно понятно, так что расписывать переменные не буду.
Структуру таблицу опишу ниже.
Так вот в чем вопрос. Раньше когда постов было не очень много, скрипт работал удовлетворительно, но теперь их стало больше, и он начинает заметно тормозить (9-15 сек) на локалке.
Теперь вопрос: Можно ли данный запрос оптимизировать?
Решения:
1. сама оптимизация запроса, возможно он написан не верно.
2. делать запросы в цикле по каждому последнему посту в данной теме
3. при каждом добалении поста, изменять дату в таблице тем.
Что подскажите??? Какой выбрать?
Заранее спасибо.
С уважением, Rodent
Название: Проектирование форума
Отправлено: Меняздесьдавнонет от 07 Января 2006, 15:43:08
самое первое, что нужно сделать, это запустить свой запрос в консоли, написав перед ним слово explain
explain select ...
И смотреть, что напишет.
Хотя, и так, в общем, понятно, что нет нужных индексов на связях таблиц
Название: Проектирование форума
Отправлено: Rodent от 07 Января 2006, 16:18:39
А можно с этого места поподробнее...
Или что почитать?

Так что же получается что запрос правильный, это неправильно сконструирована бд. И получается  первый вариант решения наилучший?
Название: Проектирование форума
Отправлено: Rodent от 07 Января 2006, 18:02:49
вот что мне вывел explain

id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE t2 ALL NULL NULL NULL NULL 481 Using temporary; Using filesort
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 weare.t2.topic_id 1 Using where
1 SIMPLE t3 ALL NULL NULL NULL NULL 481  
 

Что это значит?
Название: Проектирование форума
Отправлено: Rodent от 10 Января 2006, 18:56:20
мне никто советом не поможет?
Название: Проектирование форума
Отправлено: Rodent от 11 Января 2006, 13:00:55
Please help.
Что мне делать с моим запросом?
Какой из вариантов выбрать?

RomikChef, да плиз конкретный ответ.
Название: Проектирование форума
Отправлено: Меняздесьдавнонет от 11 Января 2006, 13:44:21
это значит, что индексы надо ставить.
у тебя база перебирает три таблицы
первую строку одной таблицы, и для ней - каждую строку второй таблицы. и для каждого сочетания - каждую строку третьей тбалицы.

ты думаешь, индексы для чего придумали? Для красоты?
Название: Проектирование форума
Отправлено: CGVictor от 11 Января 2006, 14:32:27
[off]RomikChef
Кстати, со временем инфы по MySQL на phpfaq стало казаться явно мало... Мож, что-нибудь сложить туда что-нибудь как раз по запросам, индексам и проч...?[/off]
Название: Проектирование форума
Отправлено: Rodent от 12 Января 2006, 23:06:05
Итак, нашел литературку по индексам.
Скачал кучу книг.
Вот как мне показалось неплохие ссылочки:
http://www.compdoc.ru/bd/mysql/indexuse/
http://www.podgoretsky.com/ftp/Docs/DB/MySqlManual/Indexes.html

Проставил в своей таблице индексы. Однако на быстродействие это никак не повлияло!
Может я чего-то не догоняю.
Объясните плиз нормальным (для чайника) языком, что такое индексы, с чем едят, и на что их ставят???
Название: Проектирование форума
Отправлено: Rodent от 12 Января 2006, 23:11:47
Вот что мне выдал EXPLAIN


id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE t1 ref PRIMARY,i_fid i_fid 3 const 1 Using where; Using temporary; Using filesort
1 SIMPLE t2 ref i_tid i_tid 4 weare.t1.tid 3  
1 SIMPLE t3 ALL NULL NULL NULL NULL 481  
Название: Проектирование форума
Отправлено: Rodent от 13 Января 2006, 19:41:32
Ап
Название: Проектирование форума
Отправлено: Rodent от 14 Января 2006, 01:14:31
Может кто-нить поможет советом?
Название: Проектирование форума
Отправлено: Rodent от 15 Января 2006, 22:36:35
начал тему 07.01.06
народ помогите?
или форум вымер на время праздников, надеюсь след неделя будет продуктивней.

С праздниками прошедшими Вас, форумчани-скриптовщики
Название: Проектирование форума
Отправлено: CGVictor от 16 Января 2006, 00:36:33
Rodent
http://www.mysql.ru/docs/man/MySQL_indexes.html
http://www.mysql.ru/docs/optimal.html
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
http://www.mysql.ru/docs/man/EXPLAIN.html

А про остальное тебе Ромик расскажет, не буду лезть в тему.

[off][m] Ром, ему при таком запросе целесообразно забить в индексы t1.tid, t3.pid, t2.date? А композитный t1.(forum_id+tid)? Что-то я не сильно осознал possible_keys в его explain... Что скажешь?..[/off]
Название: Проектирование форума
Отправлено: Rodent от 16 Января 2006, 18:56:15
CGVictor
Спасибо за ссылочки.

Ждем\'с ответа RomikChef  
Название: Проектирование форума
Отправлено: Rodent от 17 Января 2006, 21:40:05
Я тут просмотрел исходники других форумов.
Так вот там в таблице тем (forum), постоянно обновляется номер, дата, и автор последнего поста.
А именно от этого я и хотел уйти. :-((
А тут получается, что при добавлении каждого нового поста . нужно обновлять инфу в самой таблице названия соответсвующей темы!
Неужели это единственный выход, для быстрой работы форума?
Название: Проектирование форума
Отправлено: hanslinger от 18 Января 2006, 08:05:59
А что тебя смущает? Можешь, конечно, каждый раз выбирать последнее сообщение из такой-то темы... =)
Название: Проектирование форума
Отправлено: Макс от 18 Января 2006, 10:17:42
Цитировать
Rodent:
Неужели это единственный выход, для быстрой работы форума?

денормализация - это вполне стандартный способ увеличения производительности. Есть ли другие способы - в каждом случае надо изучать отдельно.
Название: Проектирование форума
Отправлено: Kwazar от 20 Января 2006, 15:45:34
Это самый гуманный способ, как для сервера, так и для программиста.
Название: Проектирование форума
Отправлено: FlaID"Zeres от 28 Января 2006, 18:46:34
Не знаю туда ли попал. Помогите плиз кто-нить!!!
Решил за форум взятся. Скачал денвер, на localhost\'е зарегил базу данных, терь типа форум клепать на php остаётся.
от только не знаю, как БД можно связать со  скриптом и как ей управлять. Подскажите ПЛИЗ кто может!!! Век буду благодарен.
Название: Проектирование форума
Отправлено: hanslinger от 29 Января 2006, 01:06:45
Не туда.
Для того, чтобы тебе «склепать» форум, достаточно phpBB. Поищи это слово в Google.
Название: Проектирование форума
Отправлено: commander от 30 Января 2006, 13:21:22
тема закрыта!