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 DELAYEDfunziona 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 DELAYEDcon MyISAM. INSERT DELAYEDdovrebbe essere utilizzato solo per le istruzioniINSERTche specificano una lista di valori. Il server ignoraDELAYEDper le istruzioniINSERT ... SELECTe leINSERT ... ON DUPLICATE KEY UPDATE.- Siccome l'istruzione
INSERT DELAYEDtermina immediatamente, prima che le righe vengano inserite, non è possibile utilizzareLAST_INSERT_ID()per ottenere il valoreAUTO_INCREMENTgenerato da questa istruzione. - Le righe inserite con
DELAYEDnon sono visibili alle istruzioniSELECTprima dell'effettivo inserimento in tabella. DELAYEDviene ignorato dai server slave, che quindi trattano leINSERT DELAYEDcome normaliINSERT. Questo perchéDELAYEDpotrebbe provocare una differenza tra i dati degli slave e quelli del master.- Le istruzioni
INSERT DELAYEDpendenti saranno perdute se una tabella ha un lock in scrittura e ALTER TABLE viene utilizzato per modificare la struttura della tabella. INSERT DELAYEDnon è supportata dalle viste.INSERT DELAYEDnon è supportata dalle tabelle partizionate.