2010-12-10 7 views
9

У меня есть таблица с полем :: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMPMySQL с задержкой вставки временной метки

Мой вопрос, если я использую задержанную вставку на этой таблице, будет метка времени будет время, когда запрос находится в очереди или время, когда вставка на самом деле сделано?

ответ

6

Ответ, когда запрос находится в очереди, но это не обязательно правильно, когда делается запрос, так как запрос поставлен в очередь после того, как поток для таблицы устанавливается если его еще нет.

От mysql 5.1 dev docs:

Нити выполняет оператор, но вместо написания строки в таблицу INSERT , он помещает копию окончательной строки в очередь, которая управляется поток обработчика. Любые ошибки синтаксиса замечены потоком и сообщаются клиенту .

Порядок событий, когда задержанный оператор выполняет:

  1. обработчик нити для таблицы создается, если есть не один уже
  2. обработчик проверяет для или ожидает получить DELAYED блокировка
  3. обработчик выполняет INSERT и поставить финальную строку в очередь
  4. , когда строка фактически вставлена, бинарный журнал обновляется
  5. обработчик пишет delayed_insert_limit строк в то время и выполняет любой очереди SELECTS между операциями записи
  6. , когда очередь пуста, DELAYED блокировка снимается

В зависимости от того, должен ли поток должен быть создан или нет, и как требуется много времени для проверки или получения блокировки DELAYED, время между выполнением оператора (шаг 0) и исполнением инструкции (шаг 3) будет отличаться. Затем, в зависимости от того, насколько велика очередь (особенно если она превышает delayed_insert_limit строк), и произойдет ли ожидающий SELECTS, запись будет отложена на некоторое непредсказуемое количество времени.

+0

Я думаю, что вы правы (но не уверены). Потому что, если поток * выполняет * инструкцию для * report * синтаксических ошибок, если они есть, вероятно, также будет «расширять» CURRENT_TIMESTAMP до фактической метки времени. – 2010-12-10 16:41:24

0

Это должно занять время фактической вставки

1

Независимо, если INSERT DELAYED используются, или если таблица заблокирована из-за другой поток или обновление или этажерки, значение ts займет равно времени INSERT был выдан.

+0

Вы имеете в виду «фиктивный» INSERT, созданный потоком обработчика или INSERT, который фактически выполняется в базе данных. – 2010-12-10 16:42:59

+0

Когда команда была выдана клиентским потоком. – Riedsio

Смежные вопросы