Наши веб-серверы записывают некоторую информацию для отслеживания в базу данных MySQL (используя INSERT DELAYED в таблицу MyISAM). Когда в этой таблице выполняется огромный запрос SELECT или когда она заблокирована по другой причине, процессы веб-сервера (с INSERT DELAYED) ждут базы данных, и в некоторых случаях в Apache достигается предел MaxServer, поэтому они прекращают обслуживание запросов. .
Мы используем INSERT DELAYED, потому что
Параметр DELAYED для оператора INSERT - это расширение MySQL для стандартного SQL, которое очень полезно, если у вас есть клиенты, которые не могут или не должны ждать завершения INSERT. Это обычная ситуация, когда вы используете MySQL для ведения журнала и периодически выполняете операторы SELECT и UPDATE, выполнение которых занимает много времени.
Цитата из Документация MySQL.
Мне интересно, почему процессы Apache ждут завершения INSERT DELAYED. И что я могу сделать, чтобы просто отправить данные и забыть об этом. (Так как это данные журнала, меня не волнует, потеряем ли мы какие-то записи.) Даже когда таблица заблокирована, сценарий PHP должен просто продолжаться и не должен ждать ответа MySQL.
(Мы не хотим настраивать Master-slave для этой таблицы, но мы думаем о перемещении этих данных в некоторую базу данных NoSQL. Но пока я хотел бы знать, почему INSERT DELAYED не работает должным образом.)
Мне кажется, что вы делаете правильные вещи, чтобы получить то, что хотите, и то, что вы описываете, - это то, как это должно работать. Мысли: