Domanda

Ho installato MySQL esempio 5.1x su una macchina Linux (768MB di RAM). Ho ripristinato un backup di circa 1000 righe e attraverso la mia applicazione .NET (distribuito su un altro server web di Windows) ho eseguito alcune operazioni di lettura, che, se si considera che la tabella non aveva gli indici, sono stati veloci.

Allora ho cancellato il server da queste righe e usato una funzione nella mia applicazione web sull'altro server per inserire righe (Fondamentalmente, ho letto il testo fuori un file di testo, inserendo i dati in campi di una classe personalizzata, e quindi chiamando una stored procedure con questi parametri per ciascun record). Quando ho avuto il sito web e il database sia sulla mia macchina locale, vorrei inserire 2500 file istantaneamente (meno di un secondo). Ora, però, nell'ambiente "produzione", queste stesse 2500 righe stanno prendendo 10 minuti da inserire. Sto usando il my.cnf di default che viene fornito con l'installazione di MySQL.

C'è un modo posso ottimizzare le scritture senza compromettere la velocità delle operazioni di lettura? O mi manca qualcosa di ovvio?

Grazie in anticipo!

È stato utile?

Soluzione

Hai guardato la pagina di manuale di MySQL per la velocità di inserimento ? La prima ipotesi che viene in mente per me è che non si sta avvolgendo il set di 2500 procedure in un Inizia transazione / Commit dichiarazione, in modo MySQL è autocommitting ognuna delle 2500 azioni.

Altri suggerimenti

Oltre al problema citato da Mark (auto-commit invece di transazione), mi piacerebbe sicuramente indagare usando aggiornamenti batch. Perché una grande differenza tra una connessione locale e una connessione di rete (anche uno molto veloce) è il tempo di andata e ritorno.

Mentre la larghezza di banda è molto probabilmente non il fattore limitante in questo caso, facendo 2500 comunicazioni di rete al database e ritorno sarà sicuramente richiedere molto più tempo su una rete che sulla macchina locale.

Utilizzo di un aggiornamento batch può ridurre tali inserti a un singolo andata e ritorno in posizione ideale, a pochi quelli in pratica.

Purtroppo non posso dirvi come fare quelle aggiornamenti batch nel mondo .NET, in Java devi usare PreparedStatement.addBatch() . Sono sicuro che ci sia qualcosa di simile in .NET.

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