MySQL — могу ли я ограничить максимальное время выполнения запроса?

Я ищу способ ограничить максимальное время выполнения запроса на сервере mysql. Я подумал, что это можно сделать с помощью файла конфигурации my.cnf, но не смог найти ничего подходящего в документации. Кто-нибудь знает, можно ли это сделать? Благодарю.


person sa125    schedule 25.01.2011    source источник
comment
возможный дубликат Как установить максимальное время выполнения для запроса mysql?   -  person miku    schedule 25.01.2011
comment
это указывает на lock_wait_timeout, что мне не нужно. Мне нужен тайм-аут истечения срока действия запроса, независимо от того, была ли получена блокировка или нет.   -  person sa125    schedule 25.01.2011


Ответы (4)


Update

Начиная с MySQL 5.7, вы можете включить MAX_EXECUTION_TIME подсказка оптимизатора в ваших SELECT запросах, чтобы указать серверу завершить его по истечении указанного времени.

Насколько я знаю, если вы хотите установить тайм-аут для всего сервера или если вас интересуют запросы помимо SELECTs, исходный ответ по-прежнему остается вашим единственным вариантом.

Original answer

Невозможно указать максимальное время выполнения при отправке запроса на сервер для выполнения.

Однако нередко бывает, что задание cron запускается каждую секунду на вашем сервере базы данных, подключаясь и делая что-то вроде этого:

  1. ПОКАЗАТЬ СПИСОК ПРОЦЕССОВ
  2. Найдите все соединения со временем запроса, превышающим максимально желаемое время.
  3. Запустите KILL [идентификатор процесса] для каждого из этих процессов.
person TehShrike    schedule 25.01.2011
comment
каждая секунда может быть немного излишней в зависимости от вашей ситуации. Вы должны подумать о необходимости убивать процессы, чтобы не допустить попадания в ваши max_connections - все это зависит от нагрузки на вашу конкретную машину. - person Ross; 10.06.2013
comment
Это уже не так. См. сообщения об использовании max_execution_time. - person nlta; 22.07.2021

Вы можете использовать запрос следующим образом:

SELECT MAX_STATEMENT_TIME=1000 * FROM table;

ОБНОВЛЕНИЕ: вместо этого следует использовать max_execution_time.

SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM table;

MAX_STATEMENT_TIME был переименован в max_execution_time в MySQL 5.7.8. http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_execution_time

person Alexander Kosolapov    schedule 18.02.2016
comment
Попробуйте улучшить свой ответ - person Haytem BrB; 18.02.2016

Тем временем команда Twitter выпустила свои изменения в MySQL, которые реализуют это:

- Reduce unnecessary work through improved server-side statement timeout support. This allows the server to proactively cancel queries that run longer than a millisecond-granularity timeout.

См. http://engineering.twitter.com/2012/04/mysql-at-twitter.html и https://github.com/twitter/mysql/wiki/Statement-Timeout

person faker    schedule 06.05.2012