Spec-Zone .ru
спецификации, руководства, описания, API
|
INSERT DELAYED ...
DELAYED
опция для INSERT
оператор является расширением MySQL стандартного SQL, который может
использоваться для определенных видов таблиц (такой как MyISAM
). Когда клиент
использует INSERT DELAYED
, это добирается хорошо от сервера сразу, и строка ставится в
очередь, чтобы быть вставленной, когда таблица не находится в использовании никаким другим потоком.
INSERT DELAYED
медленнее чем нормальное INSERT
если таблица не находится иначе в использовании. Есть также
дополнительные издержки для сервера, чтобы обработать отдельный поток для каждой таблицы, для которой есть
задержанные строки. Это означает, что следует использовать INSERT DELAYED
только, когда Вы действительно уверены, что нуждаетесь в
этом.
С MySQL 5.6.6, INSERT
DELAYED
осуждается, и будет удален в будущем выпуске. Использовать INSERT
(без DELAYED
) вместо этого.
Строки с очередями сохранены только в памяти, пока они не вставляются в таблицу. Это означает это, если Вы
завершаете mysqld насильственно (например, с kill
-9
) или если mysqld неожиданно умирает, теряются
любые строки с очередями, которые не были записаны диску.
Есть некоторые ограничения на использование DELAYED
:
INSERT
DELAYED
работы только с MyISAM
, MEMORY
, ARCHIVE
, и BLACKHOLE
таблицы. Для механизмов, которые не поддерживают DELAYED
, ошибка
происходит.
Ошибка происходит для INSERT DELAYED
если использующийся с таблицей, которая была заблокирована
с LOCK TABLES
потому что вставка должна быть обработана отдельным потоком,
не сеансом, который содержит блокировку.
Для 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
операторы, пока они фактически не были вставлены.
До MySQL 5.6, INSERT
DELAYED
был обработан как нормальное INSERT
если оператор вставленные многократные строки, двоичное журналирование было включено, и глобальный
формат журналирования был основан на операторе (то есть, всякий раз, когда binlog_format
был установлен в STATEMENT
).
Начинание с MySQL 5.6, INSERT
DELAYED
всегда обрабатывается как простое INSERT
(то есть, без DELAYED
опция)
всякий раз, когда значение binlog_format
STATEMENT
или MIXED
. (В последнем случае оператор больше не инициировал переключатель к
основанному на строке журналированию, и так регистрируется, используя основанный на операторе формат.)
Это не применяется при использовании основанного на строке двоичного режима журналирования (binlog_format
набор к ROW
) то в который
INSERT DELAYED
операторы всегда выполняются, используя DELAYED
опция столь же определенная, и зарегистрированный как события
обновления строки.
DELAYED
игнорируется на ведомых серверах репликации,
так, чтобы INSERT DELAYED
обрабатывается как нормальное INSERT
на ведомых устройствах. Это то, потому что DELAYED
мог заставить ведомое
устройство иметь различные данные чем ведущее устройство.
Ожидание INSERT
DELAYED
операторы теряются, если таблица является заблокированной записью и ALTER TABLE
используется, чтобы изменить структуру таблицы.
INSERT
DELAYED
не поддерживается для представлений.
INSERT
DELAYED
не поддерживается для разделенных таблиц.
Следующее описывает подробно, что происходит, когда Вы используете DELAYED
опция к
INSERT
или REPLACE
. В этом описании "поток"
является потоком, который получил INSERT
DELAYED
оператор и "обработчик"
являются потоком, который обрабатывает все INSERT
DELAYED
операторы для определенной таблицы.
Когда поток выполняет a DELAYED
оператор для таблицы,
поток обработчика создается, чтобы обработать все DELAYED
операторы для
таблицы, если никакой такой обработчик уже не существует.
Поток проверяет, получил ли обработчик ранее a DELAYED
блокировка; в противном случае это говорит потоку обработчика делать так. DELAYED
блокировка может быть получена, даже если у других потоков есть a
READ
или WRITE
соедините таблицу. Однако,
обработчик ожидает всех ALTER
TABLE
блокировки или FLUSH
TABLES
операторы, чтобы закончиться, гарантировать, что структура таблицы современна.
Поток выполняется INSERT
оператор, но вместо того, чтобы писать строку в таблицу, это
помещает копию заключительной строки в очередь, которой управляет поток обработчика. Любые
синтаксические ошибки замечаются потоком и сообщаются клиентской программе.
Клиент не может получить из сервера число дублирующихся строк или AUTO_INCREMENT
значение для получающейся строки, потому что INSERT
возвраты перед работой вставки были завершены. (Если Вы
используете API C, mysql_info()
функция не возвращает ничто значимое по той же самой причине.)
Двоичный журнал обновляется потоком обработчика, когда строка вставляется в таблицу. В случае многократной строки вставляет, двоичный журнал обновляется, когда первая строка вставляется.
Каждый раз, когда delayed_insert_limit
строки пишутся, проверки обработчика ли любой SELECT
операторы все еще находятся на рассмотрении. Если так, это разрешает им выполняться перед продолжением.
Когда у обработчика больше нет строк в
его очереди, таблица разблокирована. Если не новый INSERT DELAYED
операторы получаются в пределах delayed_insert_timeout
секунды, обработчик завершается.
Если больше чем delayed_queue_size
строки находятся на рассмотрении в определенной
очереди обработчика, запросе потока INSERT
DELAYED
ожидает, пока нет комната в очереди. Это делается, чтобы гарантировать, что mysqld не использует всю память для задержанной
очереди памяти.
Поток обработчика обнаруживается в списке процессов MySQL с delayed_insert
в Command
столбец. Это уничтожается, если Вы выполняете a FLUSH TABLES
оператор или уничтожает это с KILL
. Однако, перед выходом, это сначала
хранит все строки с очередями в таблицу. В это время это не принимает никого нового thread_id
INSERT
операторы от других потоков. Если Вы выполняетесь INSERT DELAYED
оператор после этого новый поток обработчика
создается.
Отметьте, что это означает это INSERT
DELAYED
у операторов есть более высокий приоритет чем нормальный INSERT
операторы, если есть INSERT DELAYED
выполнение обработчика. Другие операторы обновления
должны ожидать до INSERT
DELAYED
очередь пуста, кто-то завершает поток обработчика (с KILL
), или кто-то выполняет a thread_id
FLUSH TABLES
.
Следующие переменные состояния предоставляют информацию о INSERT DELAYED
операторы.
Переменная состояния | Значение |
---|---|
Delayed_insert_threads |
Число потоков обработчика |
Delayed_writes |
Число строк, записанных с INSERTDELAYED |
Not_flushed_delayed_rows |
Число строк, ожидающих, чтобы быть записанным |
Можно просмотреть эти переменные, выходя a SHOW STATUS
оператор или выполняя mysqladmin команду расширенного состояния.