C'è solo una cosa che ti manca. Soprattutto, se si sta utilizzando InnoDB, è che si desidera aggiungere esplicitamente una clausola ORDER BY nell'istruzione SELECT per garantire che stai inserendo righe in chiave primaria (indice cluster) ordine:
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id
in considerazione la rimozione indici secondari sulla tabella di backup se non sono necessari. Ciò salverà anche un po 'di carico sul server.
Infine, se si sta utilizzando InnoDB, ridurre il numero di blocchi di riga che sono necessari e solo bloccano esplicitamente entrambe le tabelle:
LOCK TABLES product_backup WRITE;
LOCK TABLES product_id READ;
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
UNLOCK TABLES;
La roba di bloccaggio probabilmente non farà una grande differenza, come chiusura di fila è molto veloce (anche se non veloce come le serrature da tavolo), ma da quando hai chiesto.
fonte
2012-06-25 13:06:41
I pensa che questo sia il modo migliore. In questo modo stai anche conservando gli indici. –
Speedwise è il massimo. Ovviamente, è possibile rimandare la creazione dell'indice sulla tabella di backup fino a quando tutti i dati non sono stati copiati, il che aumenterà significativamente la velocità di inserimento. – fvu
È interessante, grazie. Ero curioso riguardo alla copia dei dati e mi chiedevo se si trattasse di un drenaggio del database (il 'SELECT *' mi ha respinto, o se ci sarebbe voluto molto tempo per elaborare a causa del modo in cui la query è costruita). Se questo è un modo accettabile di copiare i dati, allora va bene. – crmpicco