INSERT DELAYED 語法
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
用於INSERT語句的DELAYED選項是MySQL相對於標准SQL的擴展。如果您的客戶端不能等待INSERT完成,則這個選項是非常有用的。當您使用MySQL進行日志編寫時,這是非常常見的問題。您也可以定期運行SELECT和UPDATE語句,這些語句花費的時間較長。
當一個客戶端使用INSERT DELAYED時,會立刻從服務器處得到一個確定。並且行被排入隊列,當表沒有被其它線程使用時,此行被插入。
使用INSERT DELAYED的另一個重要的好處是,來自許多客戶端的插入被集中在一起,並被編寫入一個塊。這比執行許多獨立的插入要快很多。
使用DELAYED時有一些限制:
注意,目前在隊列中的各行只保存在存儲器中,直到它們被插入到表中為止。這意味著,如果您強行中止了mysqld(例如,使用kill -9)或者如果mysqld意外停止,則所有沒有被寫入磁盤的行都會丟失。
以下詳細描述了當您對INSERT或REPLACE使用DELAYED選項時會發生什麼情況。在這些描述中,“線程”指的是已接受了一個INSERT DELAYED語句的線程,“管理程序”指的是為某個特定的表處理所有INSERT DELAYED語句的線程。
注意,如果有一個INSERT DELAYED管理程序正在運行,則這意味著INSERT DELAYED語句比常規的INSERT語句具有更高的優先權。其它更新語句必須等待,直到INSERT DELAYED語句隊列都運行完畢,或者管理程序線程被中止(使用KILL thread_id),或者執行了一個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。
文章轉載來自:http://dev.mysql.com/doc/refman/5.6/en/insert-delayed.html