2009-09-12 15 views
5

Sto eseguendo il ciclo di un numero di valori (da 1 a 100 per esempio) ed eseguendo un'istruzione preparata all'interno del ciclo.Prestazioni in PDO/PHP/MySQL: transazione rispetto all'esecuzione diretta

C'è un vantaggio nell'utilizzo di una transazione, che si verifica dopo il termine del ciclo, rispetto a un'esecuzione diretta all'interno del ciclo?

I valori non dipendono l'uno dall'altro, quindi una transazione non è necessaria da quel punto di vista.

risposta

4

Se le query sono Inserti, nella pagina 7.2.19. Speed of INSERT Statements del manuale MySQL dà due informazioni interessanti, a seconda se si sta usando un motore di transactionnal o no:

Quando si utilizza un motore non transactionnal:

Per accelerare le operazioni INSERT che sono eseguite con più istruzioni per le tabelle non transazionali , bloccare le tabelle .

Questo benefici prestazioni poiché il buffer dell'indice è lavata disco solo volta, dopo che tutte le istruzioni INSERISCI hanno completato. Normalmente, ci sarebbe come molti buffer di indice, poiché ci sono le istruzioni INSERT . Il blocco esplicito delle istruzioni non è necessario se è possibile inserire tutte le righe con un singolo INSERT.

E, con un motore transactionnal:

Per ottenere inserimenti più rapidi per tabelle transazionali, è necessario utilizzare START TRANSACTION e COMMIT invece di LOCK TABLES.

Quindi immagino che usare le transazioni possa essere una buona idea - ma suppongo che potrebbe dipendere dal carico sul server, e se ci sono più usi usando la stessa tabella nello stesso momento, e tutto ciò ...

ci sono maggiori informazioni nella pagina ho collegato a, quindi non esitate a leggerlo ;-)


E, se si sta facendo update statements:

Un altro modo per ottenere aggiornamenti rapidi è quello di aggiornare il ritardo di e quindi eseguire più aggiornamenti di seguito. L'esecuzione di più aggiornamenti insieme è molto più rapida di eseguendo uno alla volta se si blocca la tabella .

Quindi, immagino che si possa dire lo stesso che per gli inserti.


BTW: per essere sicuri, si può provare entrambe le soluzioni, li benchmarking con microtime, sul lato PHP, per esempio ;-)

+0

Grazie mille per l'informazione, credo che dovrò solo provare e punto di riferimento. – jeroen

+2

Suppongo di sì ^^ Facci sapere i risultati ;-) Potrebbe interessare altre persone! E, btw: un'altra soluzione sarebbe quella di utilizzare una query di inserimento per fare più inserimenti contemporaneamente, riducendo il numero totale di query - un po 'più difficile da codificare, ma ho visto grandi miglioramenti con questo, poiché significa meno chiama da un server all'altro. –

+0

Sì, ridurre il numero di query sarebbe la soluzione migliore, ma come ho già detto a James Black, non l'ho mai provato con INSERT ON DUPLICATE KEY UPDATE, non so nemmeno se è possibile. – jeroen

3

Per un tempo più veloce che si possa fare tutti gli inserti in un colpo solo , o raggrupparli insieme, forse 5 o 10 alla volta, come se un inserto fallisse nell'intero batch.

http://www.desilva.biz/mysql/insert.html

Una transazione vi rallenterà, quindi se non ne hai bisogno, allora non ne fanno uso.

Una dichiarazione preparata sarebbe una buona scelta anche se si inserivano in batch, poiché non è necessario continuare a creare la query ogni volta.

+0

Stavo pensando di combinarli, ma non l'ho mai provato con INSERT ON DUPLICATE KEY UPDATE. – jeroen

3

Ho affrontato la stessa domanda quando ho dovuto implementare un file CSV (possibilmente piuttosto lungo) di importazione dei dati (so che è possibile utilizzare la sintassi LOAD DATA INFILE per questo, ma ho dovuto applicare qualche elaborazione sui miei campi prima dell'inserimento).

Così ho fatto un esperimento con le transazioni e un file con circa 15k righe. Il risultato è che se inserisco tutti i record all'interno di una transazione unica, ci vogliono solo pochi secondi ed è legato alla CPU. Se non utilizzo alcuna transazione, sono necessari alcuni minuti e il limite è IO. Impegnando ogni N righe, ho ottenuto risultati intermedi.

+0

sarebbe ancora più veloce con LOAD DATA INFILE;) – NickT

Problemi correlati