Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiornamento di più righe di una singola tabella

Se ogni riga dovesse ottenere un valore diverso che non può essere derivato dai dati esistenti nel database, non c'è molto da fare per ottimizzare la complessità complessiva. Quindi non aspettarti troppe meraviglie.

Detto questo, dovresti iniziare a utilizzare le istruzioni preparate e il batching:

public void updateRank(Map<Integer,Double> map){
    Iterator<Entry<Integer, Double>> it = map.entrySet().iterator();
    String query = "";
    int i = 0;

    Connection connection = getConnection(); // get the DB connection from somewhere
    PreparedStatement stmt = connection.prepareStatement("update profile set rank = ? where profileId = ?");

    while (it.hasNext()) {
        Map.Entry<Integer,Double> pairs = (Map.Entry<Integer,Double>)it.next();
        stmt.setInt(1, pairs.getValue());
        stmt.setDouble(2, pairs.getKey());
        stmt.addBatch(); // this will just collect the data values
        it.remove();
    }       
    stmt.executeBatch(); // this will actually execute the updates all in one
}

A cosa serve:

  1. l'istruzione preparata fa sì che il parser SQL analizzi l'SQL solo una volta
  2. il batching riduce al minimo i roundtrip client-server in modo che non uno per ogni aggiornamento
  3. la comunicazione tra client e server è ridotta al minimo perché l'SQL viene trasmesso solo una volta ei dati vengono raccolti e inviati come pacchetto (o almeno un numero inferiore di pacchetti)

Inoltre:

  • Verifica se la colonna del database profileId sta usando un indice in modo che la ricerca della rispettiva riga sia sufficientemente veloce
  • Puoi controllare se la tua connessione è impostata per il commit automatico. In tal caso, provare a disabilitare il commit automatico e confermare esplicitamente la transazione dopo che tutte le righe sono state aggiornate. In questo modo anche le singole operazioni di aggiornamento potrebbero essere più veloci.