Отправить заявку

MySQL: Боремся с запросами, которые не выполняются

Обратился заказчик с интересной задачей. Разобраться почему перестали приходить смс-рассылки клиентам.

Примерный алгоритм работы был таков. По крону запускался скрипт, который выбирал по заранее известным критериям клиентов и отправлял каждому клиенту через SMS-гейт уведомления с нужным текстом.
Первым делом были изучены логи, в которых ничего толкового не было найдено.
Через консоль запрос выполнялся отлично. И несколько тестовых записей тоже срабатывали без каких-либо отклонений.
После был проведен анализ результата выдачи запроса на предмет "специальных символов", которые могли бы портить работу. Но и тут все было корректно. Но именно этот анализ позволил выяснить причину.
Все дело в том, что первый запрос на выборку выбирал примерно 500000 позиций и для каждой позиции на PHP уже анализировался и подбирался нужный текст по определенным шаблонам регулярных выражений. Работа скрипта занимала достаточно много времени. Накапливалась переменная собиравшая все в один большой запрос для добавления его на сервер, который во время работы скрипта попросту закрывал соединение т.к. оно превышало допустимое значение.
Итак:

set wait_timeout=250;

Как видно из конфига - 250 секунд - это время, которое сервер ожидает обращений к нему после последнего запроса.
Таким образом после первый выборки, время работы PHP скрипта занимало примерно 6 минут и сервер просто закрывал соединение.
Тут было несколько решений. От увеличения wait_timeout до разбивки одного большого INSERT на несколько, что и было сделано.
Как только INSERT накапливал 100000 он сразу отправлял фоновым запросом этот пакет и продолжал собирать новый.
Само собой были пересмотрены регулярные выражения и существенно ускорена их работа.

Таким способом удалось уменьшить время скрипта и главное - восстановить работоспособность!
1с утп

Другие публикации