В чём может быть причина долгой загрузки mysql?

По каким причинам может тормозить mysql? Порой открытие топика занимает от 4 до 8 секунд. С чем это может быть связано? Записей в бд немного. Хотя вместе с бд ливстрит, в неё же запихана бд пхпбб, причём у пхпбб есть своя база отдельно. Может быть в этом дело? Или может быть дело в большой отдалённости от сервера?

72 комментария

avatar
А почему вы думаете что это именно mysql?
под админом откройте топики и посмотрите снизу сколько времени на что уходит, может php долго страницы формирует.
А вообще может дело с тем что хостинг слабый?
avatar
Просто если бы тупил пхп, то тупил бы только он. А тут тормозит mysql, следовательно пхп тоже долго грузит код изза этого.
Hostmonster хостинг, вы не знаете слабый нет?
avatar
Я пользуюсь FastVPS тарифом OVZ-5, но думаю и OVZ-4 может на первое время подойти, только нужно все равно оптимизировать чтобы быстрее работало.
А какие характеристики вашего тарифа на Hostmonster?
avatar
Не могу понять где у них характеристики серверов.
avatar
Ну понятно у них обычный шаред хостинг, и никаких ресурсов они не гарантируют, и все зависеть будет больше от того какие сайты оказались на вашем сервере, и так как их там тысячи жесткие диски работаю на износ и ваши данные медленнее будут отдаваться, а так как mysql тоже по сути на жестком диске базы держит то сами понимаете. И тот же самый кэш у вас явно не memcache тоже с жесткого диска берется.
avatar
Неужели он такой плохой?(
Почему тогда все его нахваливают?
avatar
Почему плохой, хороший, для маленьких ресурсов. Это проблема всех шаред хостингов, когда большое количество посещений и на сервере тысячи сайтов, узким местом будет жесткий диск.
avatar
А может всё таки в пинге проблема?
avatar
Пинг это не время выполнения
avatar
А есть смысл урезать какие то функции, чтобы было меньше запросов?
avatar
Мне кажется у вас проблема не в функциях, а в хостинге.
Сделайте скрин нижней части с выводом времени выполнения.
avatar
avatar
Можете использовать плагин профайлера, он идет со стандартной сборкой чтобы определить что это за чудо запросы которые умудряются столько времени скушать.
avatar
А как им пользоваться?
avatar
Активируете плагин, включаете его использование в конфиге, потом по сайту страницы открываете, отключаете в конфиге использование плагина, загружаете логи в плагин профайлера и смотрите что долго выполнялось.
avatar
UPDATE prefix_topic_read SET comment_count_last = '4' , comment_id_last = '0' , date_read = '2012-05-06 14:34:15' WHERE topic_id = '39' AND user_id = '1' 

Вот этот запрос больше всего ест. В чём смысл?
avatar
Этот запрос отмечает какие комментарии уже были прочитаны.
avatar
А как убрать его?
avatar
update вообще самая требовательная операция.
Имхо у вас не самый качественный хостинг. И в этом вся проблема.
avatar
Блин, но мне не выгодно переезжать(
avatar
Представь ты живешь в комнате с 10ю гастарбайтерами, и все как то не очень живется и ты скажешь, блин, но мне не выгодно переезжать =)
avatar
Ясно, ну ладно(
Я думал может как то можно было урезать возможности движка, а оказывается даже нет смысла.
avatar
Можно вырезать все операции update и тогда смысл даже проглядываться не будет :)
Тут дело то не в одних лишь отметках о прочтении комментариев. Попробуйте отредактировать топик, наверняка будет такая же ситуация.
avatar
Да, во многих вещах так.
avatar
какой тип таблиц InnoDB или MyIsam?
avatar
Если InnoDb, то возможно, хреново настроен мускул.
Может не хватать памяти буфера или еще чего-то.
Если не критична потеря некоторых данных при сбоях, то просите хостера поставить в настройках my.cnf
innodb_flush_log_at_trx_commit = 0  (или 2)
avatar
Ну так то потеря критична
avatar
InnoDB. А для форума пхпбб MyIsam и там работает быстрее.
avatar
Сделайте бэкап и конвертните таблицы в MyIsam. Потеряете, правда релейшены, но они особо не важны. Вроде в движке все равно связанная инфа скриптом обновляется.
avatar
А как грамотно бэкапнуть?
avatar
в консоли
mysqldump -u usr_name -pPassword dtb_name > filename
avatar
Что то не хотит, ошибки выдаёт. Пароль и юзера самому писать или запрос сам распознается?
avatar
А консоль в phpmyadmin находится?
avatar
та нет, по ssh.
Если нет доступа, то сделайте export через phpmydmin
avatar
Что то не получается преобразовать таблицы. Система ругается на внешние ключи.
avatar
#1217 — Cannot delete or update a parent row: a foreign key constraint fails
avatar
да, их либо надо прибить (можно через phpmyadmin),
либо в my.cnf расскомментить skip-innodb
avatar
Нет, я лучше оставлю всё как есть. Потом не хочу мучиться с данными когда нарушится целостность.
avatar
ну вообще я у себя такое делал, просто сдампил, а потом восстановил сразу в myisam
avatar
Ну, по функционалу myisam явно уступает innodb
avatar
Ну возможность использования внешних ключей тут не особо помогает при нагрузке. Ведь при записи база начинает совершать манипуляции по обновлению связанных таблиц, блокируя записи, что приводит к тормозам. Смысла нет, когда скриптом они и так обновляются.
avatar
да и по памяти innodb может кушать прилично
avatar
А если я удалю топик, то коменты ведь не удалятся и сердечки от избранного с голосами тоже, придётся всё вручную удалять
avatar
так а вот функция в модуле топика, которая запускается при удалении:

/**
 * Удаляет свзяанные с топика данные
 *
 * @param  int  $iTopicId
 * @return bool
 */
public function DeleteTopicAdditionalData($iTopicId) {
    /**
     * Чистим зависимые кеши
     */
    $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update'));
    $this->Cache_Delete("topic_{$iTopicId}");
    /**
     * Удаляем контент топика
     */
    $this->DeleteTopicContentByTopicId($iTopicId);
    /**
     * Удаляем комментарии к топику.
     * При удалении комментариев они удаляются из избранного,прямого эфира и голоса за них
     */
    $this->Comment_DeleteCommentByTargetId($iTopicId,'topic');
    /**
     * Удаляем топик из избранного
     */
    $this->DeleteFavouriteTopicByArrayId($iTopicId);
    /**
     * Удаляем топик из прочитанного
     */
    $this->DeleteTopicReadByArrayId($iTopicId);
    /**
     * Удаляем голосование к топику
     */
    $this->Vote_DeleteVoteByTarget($iTopicId,'topic');
    /**
     * Удаляем теги
     */
    $this->DeleteTopicTagsByTopicId($iTopicId);
    /**
     * Удаляем фото у топика фотосета
     */
    if ($aPhotos=$this->getPhotosByTopicId($iTopicId)) {
        foreach ($aPhotos as $oPhoto) {
            $this->deleteTopicPhoto($oPhoto);
        }
    }

    return true;
}
avatar
О, так значит никаких последствий не будет после смены типа таблиц?
avatar
у меня MyIsam стоит, пока багов не наблюдаю
avatar
OpenVZ — почти такой же шаред. xen и только он)
avatar
Приведите пример хостинга с XEN виртуализацией с такими же параметрами и соизмерной ценой?
Я считаю для начала такого, а если проект вырастет, то тут уже нужно сервер брать, а не с VPS мучиться.
avatar
Clodo.
Сервер кушает примерно 180мб оперативки, от посетителей не зависит. На данных момент их 200-300, в ближайшее время будет 5к(посмотрим, какая нагрузка будет на сервер).
Плачу не больше 200р/месяц.
До этого был interserver(они тоже ресселят хетцнер) c гигом оперативки, некоторые запросы к бд были ужасно медленными.
avatar
Интересно почему на хабре том же самом Clodo недолюбливают, может там раз на раз не приходится, как повезет?)
avatar
А дата этого недолюбливания какая? Год назад там были проблемы, сейчас ок.
avatar
Недолюбливание видать с тех пор и до сих пор идет, кто то говорит хорошо, кто то видать с тех пор говорит плохо что все =)
avatar
Как ты платишь 200 рублей в месяц если минимальный тариф 232 рубля в месяц и это со скидкой 30%?
180 оперативки? значит данных пока не много? memcache потом зажрет еще ого, тем более не плохо еще кэш шаблонов в память загонять.
Что мне понравилось у них что SAS диски, а не обычные десктопные винты. Но не понравилось что трафика только 25Gb, а потом платить, для расширения тяжело будет и если сервер сломают то можешь попасть на бабки.
avatar
Я использую облачный хостинг, а не виртуальный.
Использую xcache в качестве опкод кэшера. С наплывом посетителей начну кэшировать контент для незарегистрированных.
На счет данных — смотря с чем сравнивать, пока не особо много.
avatar
у меня тоже самое только без пхпбб, мучаюсь с хостингом, гоняю с сервера на сервер, пока результаты временные
avatar
Но ведь у меня работает так только движок ливстрит, на пхпбб всё работает как надо.
avatar
А кэширование у вас включено в Livestreet?
avatar
Да, включено. С кэшем проблем нет.
avatar
Тогда, по сути у вас большей части данные берутся из кэша и тогда mysql меньше задействован. Думаю все же может вам мало выделяют процессорного времени на хостинге. Я когда делал нагрузочные тесты как раз получалось что процессор лихо грузит при большом количестве одновременных запросов.
avatar
А может тогда можно оптимизировать под меньшее количество запросов?
avatar
Но почему тогда mysql всё равно задействуется если написано что несколько секунд уходит на запросы?
avatar
Возможно у вас плагины какие то стоят которые плохо используют кэширование?
avatar
Может быть. Стоят такие плагины как сквозная авторизация, aceadminpanel
avatar
Попробуйте на время отключить все плагины и посмотреть как будет работать, и все таки убедитесь что кэширование включено.
avatar
Нет, что с плагинами, что без них всё равно одно и тоже. Кэш точно включён.
avatar
Какое кэширование включено? File?
avatar
Какое по умолчанию в ливстрите было такое и включено. Я не знаю какое именно.
avatar
Отключайте и пробуйте.
avatar
Пробовал, не помогло.
avatar
У меня была такая же проблема и я решил её переездом к другому хостеру.
avatar
Но мне это не выгодно
avatar
Ситуация разрешилась. Убрал со всех таблиц внешние ключи, преобразовал их в Myisam и теперь всё быстро работает)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.