Описание проблемы: Долгое выполнение запроса в некоторых темах
Произведенные изменения, после которых начались неполадки: Изменений не было
Версия phpBB: 3.0.9
Используемые стили: prosilver
Используемые моды:
Версия PHP: 5.2
Используемая СУБД и её версия: mysql 5
Ссылка на конференцию: kupivsp.ru
Есть ли у вас тестовый аккаунт: нет, могу создать конечно
Использовался ли поиск для решения проблемы: да
Если да, то какие запросы вы использовали: phpbb_zebra
В некоторых темах идет очень долго выполнение этого запроса, я вначале думал это как то зависит от количества постов в сообщении, ан нет, никак не зависит, сам запрос.
SELECT u.*, z.friend, z.foe, p.* FROM (phpbb_users u, phpbb_posts p) LEFT JOIN phpbb_zebra z ON (z.user_id = 2 AND z.zebra_id = p.poster_id) WHERE p.post_id IN (588049, 588039, 587515, 587460, 587418, 587414, 587307, 587300, 587278, 587254, 587251, 587243, '449830')
AND u.user_id = p.poster_id
Очень долго, это секунд 20-60. Время выполнения смотрел при открытии темы нажав на кнопку explain. Посмотрел, это таблицы друзей недругов и честно говоря совершенно не понимаю, в чем может быть дело. Очень прошу совета, куда копать. В самой таблице всего 2900 записей, достаточно маленькая.
upd. База данных на данный момент весит 2,3 гб. Интересно сколько будет весит после оптимизации
Долгое выполнения запроса с таблицей phpbb_zebra
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
Долгое выполнения запроса с таблицей phpbb_zebra
Последний раз редактировалось mih_io 24.10.2011 17:36, всего редактировалось 1 раз.
-
MIT
- Former team member
- Сообщения: 2500
- Стаж: 17 лет 6 месяцев
- Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
- Благодарил (а): 3 раза
- Поблагодарили: 351 раз
Re: Долгое выполнения запроса с таблицей phpbb_zebra
Дефрагментируй её при помощи phpMyAdmin, возможно, на сервере баз данных мало места и мускулю приходится сильно дробить таблицы.
Re: Долгое выполнения запроса с таблицей phpbb_zebra
Почитал про дефрагментацию таблиц. Сделаю, обязательно отпишусь. Форуму чуть больше года. Около пол миллиона сообщений. Я думаю дефрагментацию надо сделать ко всем таблицам. Пока читаю дальше как правильнее сделать.
хочу уточнить, если на живую запустить этот процесс, ничего страшного? или лучше ночью, когда людей меньше или еще лучше временно всех отключить?
upd. оптимизация конкретно этой таблицы не помогла, проблема та же. Зато объем этой таблицы вместо 200кб, стал 100кб. Сегодня ночью запущу этот процесс на все остальные таблицы.
При оптимизации было написано, что таблица оптимизацию не поддерживает и была создана заново, поэтому наверное от базы лучше всех отключу на время выполнения этой операции
хочу уточнить, если на живую запустить этот процесс, ничего страшного? или лучше ночью, когда людей меньше или еще лучше временно всех отключить?
upd. оптимизация конкретно этой таблицы не помогла, проблема та же. Зато объем этой таблицы вместо 200кб, стал 100кб. Сегодня ночью запущу этот процесс на все остальные таблицы.
При оптимизации было написано, что таблица оптимизацию не поддерживает и была создана заново, поэтому наверное от базы лучше всех отключу на время выполнения этой операции
Re: Долгое выполнения запроса с таблицей phpbb_zebra
Дефрагментировал все таблицы. Запрос стал от нормального времени до 10 сек делаться в проблемных темах. Прогресс есть. Сама БД уменьшилась на 500 мб, стала 1,8 гб
всё стало пошустрее. Но увы не вылечилось окончательно.
3 дня назад у них было серверное обновление, может в этом дело.
Ладно, завтра жду ответа от системного администратора.
upd. знаю про правило не оставлять два сообщения подряд, но я в пред. сообщении делал дописку уже, это сообщение спустя несколько часов написал. Не знаю как лучше сделать для наглядности прогресса. Если надо объединить, я объединю конечно.
всё стало пошустрее. Но увы не вылечилось окончательно.
3 дня назад у них было серверное обновление, может в этом дело.
Ладно, завтра жду ответа от системного администратора.
upd. знаю про правило не оставлять два сообщения подряд, но я в пред. сообщении делал дописку уже, это сообщение спустя несколько часов написал. Не знаю как лучше сделать для наглядности прогресса. Если надо объединить, я объединю конечно.
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Долгое выполнения запроса с таблицей phpbb_zebra
У нас нет такого правила.mih_io писал(а):знаю про правило не оставлять два сообщения подряд
Два сообщения подряд автоматически склеиваются в одно, если временной интервал между сообщениями меньше уставленного (не знаю точно, сколько тут стоит 2 или 3 часа)
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Re: Долгое выполнения запроса с таблицей phpbb_zebra
Ошибку нашел, проблема была в этом запросе в этой части (выделено жирным)
SELECT u.*, z.friend, z.foe, p.* FROM (phpbb_users u, phpbb_posts p) LEFT JOIN phpbb_zebra z ON (z.user_id = 2 AND z.zebra_id = p.poster_id) WHERE p.post_id IN (588049, 588039, 587515, 587460, 587418, 587414, 587307, 587300, 587278, 587254, 587251, 587243,'449830')
AND u.user_id = p.poster_id
мускуль видать атрибут post_id таблицы постов из-за этого конвертировал в тип строку и сверял и поэтому были сумасшедшие цифры выполнения запроса.
Проблема из-за мода отображения первого сообщения на каждой странице. Странно, что недавно она вылезла, мод поставил еще как год назад.
В файле viewtopic.php в этом куске кода, сделал следующее исправление. То, что зеленое это добавки из мода, жирное зеленое, это дописал, чтобы не было ошибки. Оставляю здесь на всякий случай, вдруг кому надо. Тему про этот мод поищу сейчас, там еще добавлю.
if ($topic_data['topic_first_post_show'] && ($start != 0))
{
if (!$store_reverse)
{
$post_list[$i] = (int) $topic_data['topic_first_post_id'];
}
$i++;
}
while ($row = $db->sql_fetchrow($result))
{
$post_list[$i] = (int) $row['post_id'];
($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);
// First post on every page
// Show first post on every page if needed
// For the case the user is trying to reach the second half of the topic
if ($topic_data['topic_first_post_show'] && ($start != 0) && $store_reverse)
{
$post_list[$i] =(int) $topic_data['topic_first_post_id'];
}
upd. Нашел тему про этот мод First post on every page for phpBB3. Там уважаемые rxu уже посоветовал сделать это исправление в первом посте темы.
SELECT u.*, z.friend, z.foe, p.* FROM (phpbb_users u, phpbb_posts p) LEFT JOIN phpbb_zebra z ON (z.user_id = 2 AND z.zebra_id = p.poster_id) WHERE p.post_id IN (588049, 588039, 587515, 587460, 587418, 587414, 587307, 587300, 587278, 587254, 587251, 587243,'449830')
AND u.user_id = p.poster_id
мускуль видать атрибут post_id таблицы постов из-за этого конвертировал в тип строку и сверял и поэтому были сумасшедшие цифры выполнения запроса.
Проблема из-за мода отображения первого сообщения на каждой странице. Странно, что недавно она вылезла, мод поставил еще как год назад.
В файле viewtopic.php в этом куске кода, сделал следующее исправление. То, что зеленое это добавки из мода, жирное зеленое, это дописал, чтобы не было ошибки. Оставляю здесь на всякий случай, вдруг кому надо. Тему про этот мод поищу сейчас, там еще добавлю.
if ($topic_data['topic_first_post_show'] && ($start != 0))
{
if (!$store_reverse)
{
$post_list[$i] = (int) $topic_data['topic_first_post_id'];
}
$i++;
}
while ($row = $db->sql_fetchrow($result))
{
$post_list[$i] = (int) $row['post_id'];
($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);
// First post on every page
// Show first post on every page if needed
// For the case the user is trying to reach the second half of the topic
if ($topic_data['topic_first_post_show'] && ($start != 0) && $store_reverse)
{
$post_list[$i] =(int) $topic_data['topic_first_post_id'];
}
upd. Нашел тему про этот мод First post on every page for phpBB3. Там уважаемые rxu уже посоветовал сделать это исправление в первом посте темы.

