Prestazioni in DOP / PHP / MySQL: transazione contro esecuzione diretta
-
06-07-2019 - |
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.
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.