Пересчитать все форумы и статистику (зависание при большой БД)

Автор Slavegirl, 12 сентября 2013, 06:51:14

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Slavegirl

Здравствуйте!

Я периодически проверяю форум на наличие ошибок в базе данных из Админки. Сегодня, когда очередь дошла до пересчета статистики форума, была очень неприятно удивлена: процесс "завис" на 100% выполнения и завершился ошибкой: "503 - Page is temporarily unavailable". Все последующие попытки повторного запуска с нуля или с места остановки (путем обновления страницы) заканчиваются неудачей.

Как удалось выяснить, виновным оказался слишком громоздкий запрос к базе данных уже в самом конце функции пересчета статистики. Этот запрос при 1.5 млн. сообщений в БД выполняется более 60 секунд:

Sources/ManageMaintenance.php

function AdminBoardRecount()
{

..........

// Update the latest message of each board.
$request = $smcFunc['db_query']('', '
SELECT m.id_board, MAX(m.id_msg) AS local_last_msg
FROM {db_prefix}messages AS m
WHERE m.approved = {int:is_approved}
GROUP BY m.id_board',
array(
'is_approved' => 1,
)
);




При чем, хочу заметить, что выполнение предыдущих этапов пересчета статистики грамотно построено на шагах. Также в коде есть возможность увеличить/уменьшить минимальный шаг, то есть с "перегрузками" можно успешно бороться. Что касается последнего запроса, ума не приложу, как его заставить работать... Увеличивать время выполнения скриптов на сервере больше 60 секунд мне однозначно не советуют. Насколько я знаю, пересчет статистики форума не вызывается автоматически по расписанию, например как подзадача "Ежедневного/Еженедельного обслуживания" или "Оптимизации базы данных". То есть его в любом случае нужно запускать вручную обязательно с успешным завершением.

Как посоветуете решить данную проблему? Заранее огромное спасибо за ответы!




С уважением,
Slavegirl

CedarMill

Slavegirl, а сколько весить вся база данных форума (Мб)? Форум размещен на обычном хостинге или VDS или на выделенный сервере?

Может стоит попробовать (частями) оптимизировать БД через phpMyAdmin, после этого сделать пересчет статистики в админке форума.
I love SMF and Joomla!

Slavegirl

#2
CedarMill, база данных оптимизировалась сутки назад (по средам утром), размер 2.3 Гб. Форум размещается на выделенном сервере. Думаю, здесь не в размере БД проблема (в Мб), а в количестве сообщений и недоработанном коде завершающей части функции пересчета статистики (её бы тоже как-нибудь на шаги разделить нужно).

Проблема решилась временным увеличением таймаута. Надеюсь, при следующих обновлениях SMF будет обращено внимание разработчиков на данный нюанс.

Жека

Цитата: Slavegirl от 12 сентября 2013, 12:42:06Надеюсь, при следующих обновлениях SMF будет обращено внимание разработчиков на данный нюанс.
Угу, а как они об этом узнают?
Вы написали об этой проблеме на оф.форуме?

Цитата: Slavegirl от 12 сентября 2013, 06:51:14
SELECT m.id_board, MAX(m.id_msg) AS local_last_msg
FROM {db_prefix}messages AS m
WHERE m.approved = {int:is_approved}
GROUP BY m.id_board',
array(
'is_approved' => 1,
)
Запрос вообще простейший.
Тупо для каждого подраздела вычисляет последний id-шник сообщения.
В теории предполагаю, либо нет индекса по полю approved (лень лезть проверять), либо этот индекс неактуален, что вызывает fullscan таблицы => вылет за пределы 60 сек исполнения.