INSERT DELAYED

Stai visualizzando una vecchia versione di questo article. Visualizza la versione più recente.

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 istruzioni INSERT che specificano una lista di valori. Il server ignora DELAYED per le istruzioni INSERT ... SELECT e le INSERT ... ON DUPLICATE KEY UPDATE.
  • Because the INSERT DELAYED statement returns immediately, before the rows are inserted, you cannot use LAST_INSERT_ID() to get the AUTO_INCREMENT value that the statement might generate.
  • DELAYED rows are not visible to SELECT statements until they actually have been inserted.
  • DELAYED is ignored on slave replication servers, so that INSERT DELAYED is treated as a normal INSERT on slaves. This is because DELAYED 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.

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.