Назад | Перейти на главную страницу

INSERT DELAYED в заблокированных таблицах блокирует продолжение процессов PHP

Наши веб-серверы записывают некоторую информацию для отслеживания в базу данных 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 не работает должным образом.)

Мне кажется, что вы делаете правильные вещи, чтобы получить то, что хотите, и то, что вы описываете, - это то, как это должно работать. Мысли:

  • Проверьте количество потоков MySQL - не заканчиваются ли потоки в MySQL и, следовательно, не блокируются ли процессы PHP / Apache?
  • Вы используете mysql_pconnect () в PHP? Я не уверен, как обрабатывается постоянное соединение, но если оно каким-то образом заблокировано длинным выбором, это может мешать вставкам.