INSERT DELAYED
Sintassi
INSERT DELAYED ...
Spiegazione
L'opzione DELAYED
dell'istruzione INSERT
è un'estensione di MySQL all'SQL standard, molto utile se si hanno client che non possono attendere (o non hanno bisogno di farlo) che la INSERT
sia completa. E' una situazione piuttosto frequente se si utilizza MySQL per il log, e periodicamente si eseguono istruzioni SELECT
e UPDATE
che richiedono molto tempo.
Quando un client utilizza INSERT DELAYED
, ottiene un okay dal server, la riga viene messa in coda e verrà poi inserita quando la tabella non sarà più usata da altri thread.
Un altro vantaggio che deriva dall'uso di INSERT DELAYED
è che gli inserimenti richiesti da diversi client vengono associati ed eseguiti in un unico bloggo. Questo è molto più rapido che eseguire le insert separatamente.
Si noti però che INSERT DELAYED
è più lenta di una normale
INSERT
se la tabella non è già in uso. Vi è anche un ritardo aggiuntivo, perché il server deve gestire un thread separato per ogni tabella per la quale viene richiesto un inserimento. Questo significa che è meglio usare
INSERT DELAYED
solo se si è certi di averne bisogno.
Le righe accodate vengono tenute in memoria fino a quando non vengono inserite in una tabella. Questo significa che se si forza l'arresto di mysqld (per esempio con kill -9) o se mydqld si arresta inaspettatamente, tutte le righe in coda saranno perdute.
Ecco alcune limitazioni all'uso di DELAYED
:
INSERT DELAYED
funziona solo con tabelle MyISAM, MEMORY, ARCHIVE, e (a partire da MySQL 5.1.19) BLACKHOLE. Si veda MyISAM storage engine, Memory storage engine, Archive storage engine e Blackhole storage engine.- Per le tabelle MyISAM, se non vi sono blocchi liberi nel file dei dati, le SELECT e le INSERT concorrenti sono supportate. In queste circostanze, molto raramente vi è la necessità di usare
INSERT DELAYED
con MyISAM. INSERT DELAYED
dovrebbe essere utilizzato solo per le istruzioniINSERT
che specificano una lista di valori. Il server ignoraDELAYED
per le istruzioniINSERT ... SELECT
e leINSERT ... ON DUPLICATE KEY UPDATE
.- Because the
INSERT DELAYED
statement returns immediately, before the rows are inserted, you cannot useLAST_INSERT_ID()
to get theAUTO_INCREMENT
value that the statement might generate. DELAYED
rows are not visible toSELECT
statements until they actually have been inserted.DELAYED
is ignored on slave replication servers, so thatINSERT DELAYED
is treated as a normalINSERT
on slaves. This is becauseDELAYED
could cause the slave to have different data than the master.- Pending
INSERT DELAYED
statements are lost if a table is write locked and ALTER TABLE is used to modify the table structure. INSERT DELAYED
is not supported for views.INSERT DELAYED
is not supported for partitioned tables.