Тему instantcms.ru/forum/thread9203.html перечитал...
У себя:
1. поправил запрос получения новых комментов (LIMIT 70), мне хватает 10.
2. убрал вывод комментов гостей
3. убрал лишние галочки категорий (не использую FAQ)
4. поставил максимально возможное кеширование
5. применил хак, когда кэш обновляется только для авторизованных пользователей (автор вроде Sjen, найти у него в блоге не могу...)
6. и этот instantcms.ru/blogs/poleznosti-ot-sjen/hak-optimizacija-vyvoda-komentariev.html
В какую еще сторону смотреть?
public function query($sql, $ignore_errors=false){ $inConf = cmsConfig::getInstance(); $sql = $this->replacePrefix($sql); if ($inConf->debug){ $mtime = $mtime[1] + $mtime[0]; $tstart = $mtime; } if ($inConf->debug){ $mtime = $mtime[1] + $mtime[0]; $tend = $mtime; $tpassed = ($tend - $tstart); } if ($inConf->debug){ $this->q_count += 1; $this->q_dump .= '<pre>'.$sql.' <b style="color:'.($tpassed<0.1 ? 'green' : 'red').';">'.$tpassed.' сек.</b></pre><hr/>'; } die('<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>'); } return $result; }
вот тут про кэширование5. применил хак, когда кэш обновляется только для авторизованных пользователей (автор вроде Sjen, найти у него в блоге не могу...)
я еще кэшировал для всех юзеров результаты некоторых запросов — ну, например, настройки модулей и компонентов, количество модулей/компонентов. ЗАпросы очень частые и выдают одно и то же, нет необходимости постоянно дергать ради них mysql. Тем самым в несколько раз уменьшал количество запросов на странице. Делал это с помощью той же самой библиотеки для кэширования, что указал по ссылке.
Спасибо lokanaft за модификацию функции… как и думал, основные нагрузки создает форум… Можно что то сделать с запросом этим?
SELECT p.pubdate, p.id AS post_id, u.id AS uid, u.nickname AS author, u.login AS author_login, t.title AS threadtitle, t.id AS threadid FROM cms_forum_posts p LEFT JOIN cms_forum_threads t ON t.id = p.thread_id AND t.is_hidden=0 INNER JOIN cms_forums f ON f.id = t.forum_id LEFT JOIN cms_users u ON u.id = p.user_id WHERE (f.NSLeft >= 94 AND f.NSRight <= 95) ORDER BY p.id DESC LIMIT 1
SELECT p.id FROM cms_forum_posts p INNER JOIN cms_forum_threads t ON t.id = p.thread_id INNER JOIN cms_forums f ON f.id = t.forum_id AND f.NSLeft >= '94' AND f.NSRight <= '95' AND f.published = 1
прописал. Не помогло. Долгие запросы остались...Возможно у вас тоже индексы почему то не учитываются.
Ваши медленные запросы нужно проверять не только так нужно просто в phpmyadmine или аналогичной программе сделать EXPLAIN запроса и посмотреть что в нем не так, ну и следовательно уже или добавлять новые индексы или просто заменить данный запрос на другой менее прожорливый.
сколько запросов у Вас делает главная страница форума
Время генерации страницы: 1.2458 сек.
Запросы к базе: 323
На форуме просто 1600 тем, 135 тысяч сообщений… Или при настроенных индексах это не существенно?
Да, если смотреть отладку то запросы в таблицу модулей вносят свою приличную лепту в задержки, их бы в кешя еще кэшировал для всех юзеров результаты некоторых запросов — ну, например, настройки модулей и компонентов, количество модулей/компонентов. ЗАпросы очень частые и выдают одно и то же, нет необходимости постоянно дергать ради них mysql. Тем самым в несколько раз уменьшал количество запросов на странице. Делал это с помощью той же самой библиотеки для кэширования, что указал по ссылке.
Как сказал maxisoft, нужно в консоли или в phpmyadmin перед SELECT добавить EXPLAIN и смотреть какие поля в запросе без индексов обрабатываются ну и для них индексы указать через USE или FORCEпрописал. Не помогло. Долгие запросы остались...
не слышал про то что они тяжелые если раставить правильно индексы, ну и еще пару полезных мелочей при оптимизации сделать: типо выборка тех полей который нужны, запись в ковычках `, ну и явно указывать поля через таблицу… т.е нужно нам поле `name` которые лежит в таблице `user_names` при вызове лучше записатьСамые "тяжелые" c JOIN, то есть те которые с нескольких таблиц делают выборку, вот как их победить
SELECT `user_names`.`name` FROM ..
к примеру у меня на 2 миллиона записей, запрос с 5 JOIN'aми выполняется всего лишь 0.3с.