Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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
-
самое первое, что нужно сделать, это запустить свой запрос в консоли, написав перед ним слово explain
explain select ...
И смотреть, что напишет.
Хотя, и так, в общем, понятно, что нет нужных индексов на связях таблиц
-
А можно с этого места поподробнее...
Или что почитать?
Так что же получается что запрос правильный, это неправильно сконструирована бд. И получается первый вариант решения наилучший?
-
вот что мне вывел 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
Что это значит?
-
мне никто советом не поможет?
-
Please help.
Что мне делать с моим запросом?
Какой из вариантов выбрать?
RomikChef, да плиз конкретный ответ.
-
это значит, что индексы надо ставить.
у тебя база перебирает три таблицы
первую строку одной таблицы, и для ней - каждую строку второй таблицы. и для каждого сочетания - каждую строку третьей тбалицы.
ты думаешь, индексы для чего придумали? Для красоты?
-
[off]RomikChef
Кстати, со временем инфы по MySQL на phpfaq стало казаться явно мало... Мож, что-нибудь сложить туда что-нибудь как раз по запросам, индексам и проч...?[/off]
-
Итак, нашел литературку по индексам.
Скачал кучу книг.
Вот как мне показалось неплохие ссылочки:
http://www.compdoc.ru/bd/mysql/indexuse/
http://www.podgoretsky.com/ftp/Docs/DB/MySqlManual/Indexes.html
Проставил в своей таблице индексы. Однако на быстродействие это никак не повлияло!
Может я чего-то не догоняю.
Объясните плиз нормальным (для чайника) языком, что такое индексы, с чем едят, и на что их ставят???
-
Вот что мне выдал 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
-
Ап
-
Может кто-нить поможет советом?
-
начал тему 07.01.06
народ помогите?
или форум вымер на время праздников, надеюсь след неделя будет продуктивней.
С праздниками прошедшими Вас, форумчани-скриптовщики
-
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]
-
CGVictor
Спасибо за ссылочки.
Ждем\'с ответа RomikChef
-
Я тут просмотрел исходники других форумов.
Так вот там в таблице тем (forum), постоянно обновляется номер, дата, и автор последнего поста.
А именно от этого я и хотел уйти. :-((
А тут получается, что при добавлении каждого нового поста . нужно обновлять инфу в самой таблице названия соответсвующей темы!
Неужели это единственный выход, для быстрой работы форума?
-
А что тебя смущает? Можешь, конечно, каждый раз выбирать последнее сообщение из такой-то темы... =)
-
Rodent:
Неужели это единственный выход, для быстрой работы форума?
денормализация - это вполне стандартный способ увеличения производительности. Есть ли другие способы - в каждом случае надо изучать отдельно.
-
Это самый гуманный способ, как для сервера, так и для программиста.
-
Не знаю туда ли попал. Помогите плиз кто-нить!!!
Решил за форум взятся. Скачал денвер, на localhost\'е зарегил базу данных, терь типа форум клепать на php остаётся.
от только не знаю, как БД можно связать со скриптом и как ей управлять. Подскажите ПЛИЗ кто может!!! Век буду благодарен.
-
Не туда.
Для того, чтобы тебе «склепать» форум, достаточно phpBB. Поищи это слово в Google.
-
тема закрыта!