SELECTHANDLERINSERTINSERT DELAYED
UPDATEDELETETRUNCATEREPLACELOAD DATA INFILEDOBuy this Reference Manual in softcover from Barnes & Noble!
INSERT DELAYED
INSERT DELAYED ...
Опция DELAYED для команды INSERT является специфической для MySQL возможностью, которая очень полезна, если клиент не может ждать завершения команды INSERT. Такая проблема встречается часто - она возникает, когда MySQL используется для ведения журналов (проще говоря, для логгинга) и при этом периодически запускаются команды SELECT и UPDATE, для выполнения которых требуется много времени. Оператор DELAYED был введен в версию MySQL 3.22.15. Он является расширением MySQL к ANSI SQL92.
INSERT DELAYED работает только с таблицами типа ISAM и MyISAM. Следует учитывать, что таблицы MyISAM поддерживают одновременное выполнение SELECT и INSERT, поэтому если нет свободных блоков в середине файла данных, то необходимость в применении INSERT DELAYED возникает очень редко. See section 7.1 Таблицы MyISAM.
При использовании оператора INSERT DELAYED клиент сразу же получает успешный ответ от сервера, а запись будет добавлена в таблицу сразу же после того, как эту таблицу перестанет использовать другой поток.
Еще одно существенное преимущество применения оператора INSERT DELAYED заключается в том, что данные от многих клиентов собираются вместе и записываются одним блоком. Это намного быстрее, чем несколько отдельных операций вставки.
Обратите внимание: в настоящее время все записи, поставленные в очередь на добавление, хранятся только в памяти до тех пор, пока они не будут записаны на диск. Отсюда следует, что если выполнение mysqld будет завершено принудительно (kill -9) или программа умрет, то все находящиеся в очереди данные, которые не записаны на диск, будут потеряны!.
Ниже детально описано, что происходит при использовании опции DELAYED в командах INSERT или REPLACE. В этом описании ``поток'' понимается как поток, принимающий команду INSERT DELAYED, а ``обработчик'' - это поток, который обрабатывает все команды INSERT DELAYED в конкретной таблице.
DELAYED для таблицы создается поток-обработчик для обработки всех команд DELAYED в данной таблице, если подобный обработчик уже не существует.DELAYED; если нет, то он предписывает обработчику сделать это. Блокировка DELAYED может быть осуществлена даже в случае, если блокировки READ или WRITE на данной таблице уже выполнены другими потоками. Однако обработчик будет ожидать всех блокировок ALTER TABLE и завершения всех команд FLUSH TABLES, чтобы убедиться в том, что структура таблицы соответствует последнему обновлению.INSERT, но вместо записи строки в таблицу он ставит финальную копию этой строки в очередь, управляемую потоком-обработчиком. Поток отмечает все синтаксические ошибки и сообщает о них клиентской программе.AUTO_INCREMENT для данной результирующей строки; он также не может получить эти данные с сервера, поскольку команда INSERT возвращает результат до полного завершения операции вставки. По той же причине ничего существенного не даст и использование функции C API mysql_info().delayed_insert_limit строк, обработчик проверяет, не находятся ли в ожидании выполнения какие-либо команды SELECT. Если да, то обработчик перед продолжением своей работы ``пропускает их вперед'' на выполнение.delayed_insert_timeout секунд не поступят никакие новые команды INSERT DELAYED, то обработчик завершит свою работу.delayed_queue_size строк уже ожидают в очереди обработчика, то поток, запрашивающий INSERT DELAYED, будет ждать, пока не освободится место в очереди. Таким образом можно иметь уверенность в том, что mysqld не займет всю память сервера для хранения запросов данной очереди.delayed_insert в столбце Command. Поток-обработчик можно уничтожить запуском команды FLUSH TABLES или командой KILL номер_потока. Однако перед своим завершением он вначале сохранит в таблице все поставленные в очередь строки. В процессе сохранения он не будет принимать никаких новых команд INSERT от иного потока. При выполнении после этого команды INSERT DELAYED будет создан новый поток-обработчик. Обратите внимание: отсюда следует, что команды INSERT DELAYED имеют более высокий приоритет, чем обычные команды INSERT, если уже существует запущенный обработчик INSERT DELAYED! Другие команды обновления должны ожидать, пока не опустеет очередь INSERT DELAYED или же пока кто-либо не прекратит выполнение потока-обработчика (с помощью KILL номер_потока) или не выполнит FLUSH TABLES.INSERT DELAYED:
| Переменная | Значение |
Delayed_insert_threads |
Количество потоков-обработчиков |
Delayed_writes |
Количество строк, записанных INSERT DELAYED
|
Not_flushed_delayed_rows |
Количество строк, ожидающих записи |
SHOW STATUS или выполнить команду mysqladmin extended-status.Обратите внимание: если данная таблица не используется, то команда INSERT DELAYED работает медленнее, чем обычная команда INSERT. Кроме того, возникает дополнительная нагрузка на сервер, поскольку требуется управлять отдельным потоком для каждой таблицы, для которой используется INSERT DELAYED. Это означает, что команду INSERT DELAYED следует применять только тогда, когда в ней есть реальная необходимость!
| Posted by [name withheld] on Tuesday July 30 2002, @4:11am | [Delete] [Edit] |
This can be a bit tricky. You need your target table column
names in () and then the values need to match up in the
select list. If you are using auto_increment, the first item in
the select list should be the ''.
Example:
INSERT INTO colors (keyid,firstname,lastname,favoritecolor)
SELECT '', people.firstname, people.lastname,
people.favoritecolor FROM people;
Add your own comment.