Mysql
 sql >> Database >  >> RDS >> Mysql

Un modo più veloce per eliminare le righe corrispondenti?

L'eliminazione dei dati da InnoDB è l'operazione più costosa che puoi richiederne. Come hai già scoperto, la query in sé non è un problema:la maggior parte di esse sarà comunque ottimizzata per lo stesso piano di esecuzione.

Anche se può essere difficile capire perché i DELETE di tutti i casi sono i più lenti, c'è una spiegazione piuttosto semplice. InnoDB è un motore di archiviazione transazionale. Ciò significa che se la tua query è stata interrotta a metà, tutti i record sarebbero ancora presenti come se non fosse successo nulla. Una volta completato, tutto sparirà nello stesso istante. Durante il DELETE altri client che si connettono al server vedranno i record fino al completamento del DELETE.

Per raggiungere questo obiettivo, InnoDB utilizza una tecnica chiamata MVCC (Multi Version Concurrency Control). Fondamentalmente, ciò che fa è fornire a ciascuna connessione una vista istantanea dell'intero database com'era quando è iniziata la prima istruzione della transazione. Per raggiungere questo obiettivo, ogni record in InnoDB internamente può avere più valori, uno per ogni snapshot. Questo è anche il motivo per cui COUNTing su InnoDB richiede del tempo:dipende dallo stato dell'istantanea che vedi in quel momento.

Per la transazione DELETE, ogni record identificato in base alle condizioni della query viene contrassegnato per l'eliminazione. Poiché altri client potrebbero accedere ai dati contemporaneamente, non può rimuoverli immediatamente dalla tabella, perché devono vedere il rispettivo snapshot per garantire l'atomicità dell'eliminazione.

Una volta che tutti i record sono stati contrassegnati per l'eliminazione, la transazione viene confermata correttamente. E anche in questo caso non possono essere rimossi immediatamente dalle pagine di dati effettive, prima che anche tutte le altre transazioni che funzionavano con un valore snapshot prima della transazione DELETE siano terminate.

Quindi in effetti i tuoi 3 minuti non sono poi così lenti, considerando il fatto che tutti i record devono essere modificati per prepararli alla rimozione in modo sicuro per le transazioni. Probabilmente "sentirai" il tuo disco rigido in funzione durante l'esecuzione dell'istruzione. Ciò è causato dall'accesso a tutte le righe. Per migliorare le prestazioni, puoi provare ad aumentare le dimensioni del pool di buffer InnoDB per il tuo server e provare a limitare altri accessi al database mentre elimini, riducendo così anche il numero di versioni storiche che InnoDB deve mantenere per record.Con la memoria aggiuntiva InnoDB potrebbe essere in grado di leggere la tua tabella (principalmente) in memoria ed evitare un po 'di tempo per la ricerca del disco.