INSERT DELAYED
Sintassi
INSERT DELAYED ...
Spiegazione
L'opzione DELAYED
dell'istruzione INSERT
è un'estensione di MariaDB/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 MariaDB 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
.- Siccome l'istruzione
INSERT DELAYED
termina immediatamente, prima che le righe vengano inserite, non è possibile utilizzareLAST_INSERT_ID()
per ottenere il valoreAUTO_INCREMENT
generato da questa istruzione. - Le righe inserite con
DELAYED
non sono visibili alle istruzioniSELECT
prima dell'effettivo inserimento in tabella. DELAYED
viene ignorato dai server slave, che quindi trattano leINSERT DELAYED
come normaliINSERT
. Questo perchéDELAYED
potrebbe provocare una differenza tra i dati degli slave e quelli del master.- Le istruzioni
INSERT DELAYED
pendenti saranno perdute se una tabella ha un lock in scrittura e ALTER TABLE viene utilizzato per modificare la struttura della tabella. INSERT DELAYED
non è supportata dalle viste.INSERT DELAYED
non è supportata dalle tabelle partizionate.