MySQL (RDS) запросы выполняются в моем списке процессов еще долго после завершения моих сценариев - PullRequest
2 голосов
/ 04 февраля 2020

Прежде всего, я знаю, что что-то не так в принципе с тем, как я выполняю свои запросы. Я хотел бы игнорировать причину root этого и в этом вопросе просто спросить следующее:

У меня есть скрипт PHP, работающий на Lambda (Larval Vapor). Время лямбда-функции истекает через 60 секунд при выполнении пакета запросов на вставку, обновление и удаление, однако в списке процессов MySQL я вижу, что эти запросы выполняются в течение длительного времени (десятки минут).

Откуда поступают эти запросы, если время ожидания сценария PHP истекло? Я предполагаю, что они хранятся в QUERY CACHE, но я просто догадываюсь. Я хотел бы узнать немного больше о том, как это работает.

Проблема, с которой я сталкиваюсь на данный момент, заключается в том, что время ожидания сценария php истекло, и мое приложение считает, что оно не удалось. В более поздней функции мы снова запускаем те же запросы, но, конечно, они все еще выполняются на экземпляре RDS. Поэтому мы в конечном итоге просто накладываем одинаковые запросы поверх друг друга - PHP не знает, что на сервере SQL запущены какие-либо запросы ...

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

SHOW PROCESSLIST не показывает кеш запросов. Кеш запросов не хранит запросы, он хранит результаты запросов. То есть data.

То, что вы видите в SHOW PROCESSLIST, это запущенные запросы. Когда клиент подключается, сервер MySQL создает поток на сервере. Вот что выполняет каждый запрос для этого соединения. Когда клиент закрывается, поток на сервере прерывается.

Если ваш лямбда-скрипт завершился ненормально, например, из-за ограничения AWS, сервер MySQL может не сразу понять, что клиент имеет ушел, поэтому сервер позволяет продолжать выполнение запроса до его завершения. Но не будет клиента, чтобы получить результаты. В конце концов сервер истечет время ожидания этого потока и прекратит его.

Если вы используете Lambdas, вы должны быть особенно внимательны, чтобы убедиться, что ваши запросы хорошо оптимизированы и не будут выполняться дольше, чем время выполнения Lambda. предел, который, если я помню, составляет 5 минут.

Если у вас запрос, который выполняется дольше 5 минут, он не подходит для запуска в лямбда-выражении.


Ваш комментарий:

Это довольно легко выполнить запрос SQL в течение 30 минут или более, если он сканирует большой объем данных неэффективным образом. Иногда SQL запросы настолько неэффективны, что их трудно выполнить за меньше , чем за 30 минут!

MySQL имеет возможность завершить запрос после определенного времени, но Я думаю, что это неправильное решение. Если вы заставляете сервер ограничивать время для запроса, это не означает, что вы получите результаты за меньшее время, это означает, что запрос отменен, и вы не получите никаких результатов. Аналогично, если это ОБНОВЛЕНИЕ, вы не ожидаете набор строк в качестве результата, но он все равно будет отменен. Другими словами, желаемое ОБНОВЛЕНИЕ не произойдет.

Лучшее решение - оптимизировать запрос, поэтому он обычно выполняется достаточно быстро, чтобы дать вам результаты, прежде чем вы захотите, чтобы время истекло.

0 голосов
/ 04 февраля 2020

Я предполагаю, что соединение с MySQL сервером не было закрыто должным образом из-за тайм-аута php, сервер базы данных теперь не должен прерывать выполнение запущенных запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...