INSERT DELAYED
Синтаксис
INSERT DELAYED ...
Описание
Опция DELAYED для оператора INSERT — это расширение MariaDB/MySQL стандартного SQL, которое очень полезно, если у вас есть клиенты, которые не могут или не должны ждать завершения INSERT. Такая ситуация часто встречается, когда вы используете MariaDB для ведения журнала и также периодически выполняете операторы SELECT и UPDATE, которые занимают много времени для завершения.
Когда клиент использует INSERT DELAYED, он сразу получает подтверждение от сервера, а запись помещается в очередь для вставки, когда таблица не используется ни одним другим потоком.
Еще одно важное преимущество использования INSERT DELAYED заключается в том, что вставки от многих клиентов объединяются и записываются в одном блоке. Это намного быстрее, чем выполнение многих отдельных вставок.
Обратите внимание, что INSERT DELAYED медленнее, чем обычная INSERT, если таблица не используется иначе. Также существует дополнительная нагрузка для сервера, чтобы обработать отдельный поток для каждой таблицы, для которой имеются отложенные записи. Это означает, что вы должны использовать INSERT DELAYED только в том случае, если вы действительно уверены, что вам это нужно.
Очередные записи хранятся только в памяти до тех пор, пока они не будут вставлены в таблицу. Это означает, что если вы принудительно завершите mysqld (например, с помощью kill -9) или если mysqld неожиданно завершится, любые записи в очереди, которые не были записаны на диск, будут потеряны.
Количество одновременных потоков INSERT DELAYED ограничено системными переменными сервера max_delayed_threads. Если оно установлено в 0, INSERT DELAYED отключено. Значение сессии может быть равно глобальному значению или 0 для отключения данного оператора в текущей сессии. Если этот предел достигнут, DELAYED будет молча игнорироваться для последующих операторов (ошибка не будет сгенерирована).
Ограничения
Существуют некоторые ограничения на использование DELAYED:
-
INSERT DELAYEDработает только с таблицами MyISAM, MEMORY, ARCHIVE и BLACKHOLE. Если вы выполните INSERT DELAYED с другим типом хранения, вы получите ошибку типа:ERROR 1616 (HY000): DELAYED option not supported for table 'tab_name' - Для таблиц MyISAM, если в середине файла данных нет свободных блоков, поддерживаются одновременные операторы SELECT и INSERT. В этих обстоятельствах вам очень редко нужно использовать
INSERT DELAYEDс MyISAM. -
INSERT DELAYEDследует использовать только для операторовINSERTсо списками значений. Сервер игнорируетDELAYEDдля операторовINSERT ... SELECTилиINSERT ... ON DUPLICATE KEY UPDATE. - Поскольку оператор
INSERT DELAYEDвозвращает результат немедленно, прежде чем записи будут вставлены, вы не можете использоватьLAST_INSERT_ID()для получения значенияAUTO_INCREMENT, которое может сгенерировать оператор. -
DELAYEDзаписи не видны для операторовSELECTдо тех пор, пока они фактически не будут вставлены. - После
INSERT DELAYED, ROW_COUNT() возвращает количество записей, которые вы пытались вставить, а не количество успешных записей. -
DELAYEDигнорируется на серверах репликации slave, поэтомуINSERT DELAYEDобрабатывается как обычныйINSERTна серверах slave. Это происходит потому, чтоDELAYEDможет привести к тому, что у slave будут данные, отличающиеся от master. ОператорыINSERT DELAYEDне являются безопасными для репликации. - Зависшие операторы
INSERT DELAYEDтеряются, если таблица заблокирована для записи, а ALTER TABLE используется для изменения структуры таблицы. -
INSERT DELAYEDне поддерживается для представлений. Если вы попытаетесь, получите ошибку типа:ERROR 1347 (HY000): 'view_name' is not BASE TABLE -
INSERT DELAYEDне поддерживается для разделенных таблиц. -
INSERT DELAYEDне поддерживается внутри хранимых процедур. -
INSERT DELAYEDне работает с триггерами. -
INSERT DELAYEDне работает, если введена ограничение проверки. -
INSERT DELAYEDне работает, если активен режим skip-new.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/insert-delayed/