Domanda

Sto eseguendo il ciclo attraverso un numero di valori (da 1 a 100 per esempio) ed eseguendo un'istruzione preparata all'interno del ciclo.

Esistono vantaggi nell'uso di una transazione - commit dopo la fine 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.

È stato utile?

Soluzione

Se le tue query sono INSERT, la pagina 7.2.19 . Velocità delle dichiarazioni INSERT del manuale MySQL fornisce due informazioni interessanti, a seconda che si stia utilizzando o meno un motore transazionale:

Quando si utilizza un motore non transazionale:

  

Per velocizzare le operazioni INSERT che sono   eseguito con più dichiarazioni per   tabelle non transazionali, blocca il tuo   tabelle.

     

Questo avvantaggia le prestazioni perché il   il buffer dell'indice viene scaricato solo su disco   una volta, dopo tutte le istruzioni INSERT   completato. Normalmente, ci sarebbe come   molti buffer di indice svuotano quanti ne esistono   Dichiarazioni INSERT. Blocco esplicito   le dichiarazioni non sono necessarie se è possibile   inserisci tutte le righe con un singolo INSERT.

E, con un motore transazionale:

  

Per ottenere inserimenti più rapidi per   tabelle transazionali, è necessario utilizzare   INIZIA TRANSAZIONE e COMMIT invece   di TAVOLI DI BLOCCO.

Quindi suppongo che l'utilizzo delle transazioni potrebbe essere una buona idea, ma suppongo che potrebbe dipendere dal carico sul tuo server e se ci sono più usi che usano la stessa tabella nello stesso momento e tutto il resto ...

Ci sono ulteriori informazioni sulla pagina a cui mi sono collegato, quindi non esitate a leggerlo ;-)


E, se stai facendo dichiarazioni di aggiornamento :

  

Un altro modo per ottenere aggiornamenti rapidi è quello di   ritardare gli aggiornamenti e quindi eseguire molti aggiornamenti   di seguito. Esecuzione multipla   gli aggiornamenti insieme sono molto più veloci di   facendo uno alla volta se si blocca il file   tavolo.

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


A proposito: a dire il vero, puoi provare entrambe le soluzioni, confrontandole con microtime , dal lato PHP, ad esempio ;-)

Altri suggerimenti

Per un tempo più veloce potresti fare tutti gli inserti in un colpo, o raggrupparli insieme, forse 5 o 10 alla volta, come se un inserto fallisse l'intero lotto.

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

Una transazione ti rallenterà, quindi se non ti serve non usarla.

Un'istruzione preparata sarebbe una buona scelta anche se hai fatto inserimenti batch, poiché non è necessario continuare a creare la query ogni volta.

Ho dovuto affrontare la stessa domanda quando ho dovuto implementare un file CSV (possibilmente abbastanza lungo) importazione dati (so che puoi usare LOAD DATA INFILE sintassi per questo, ma ho dovuto applicare un po 'di elaborazione sui miei campi prima dell'inserimento).

Quindi 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 è associato alla CPU. Se non utilizzo alcuna transazione, ci vogliono diversi minuti ed è limitato IO. Commettendo ogni N righe, ho ottenuto risultati intermedi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top