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 istruzioni INSERT che specificano una lista di valori. Il server ignora DELAYED per le istruzioni INSERT ... SELECT e le INSERT ... ON DUPLICATE KEY UPDATE.
  • Siccome l'istruzione INSERT DELAYED termina immediatamente, prima che le righe vengano inserite, non è possibile utilizzare LAST_INSERT_ID() per ottenere il valore AUTO_INCREMENT generato da questa istruzione.
  • Le righe inserite con DELAYED non sono visibili alle istruzioni SELECT prima dell'effettivo inserimento in tabella.
  • DELAYED viene ignorato dai server slave, che quindi trattano le INSERT DELAYED come normali INSERT. 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.

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.