Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Aktualisieren mehrerer Zeilen einer einzelnen Tabelle

Wenn jede Zeile einen anderen Wert erhalten soll, der nicht aus den vorhandenen Daten in der Datenbank abgeleitet werden kann, können Sie nicht viel tun, um die Gesamtkomplexität zu optimieren. Erwarten Sie also nicht zu viele Wunder.

Allerdings sollten Sie damit beginnen, vorbereitete Anweisungen und Batches zu verwenden:

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
}

Was das bewirkt:

  1. Die vorbereitete Anweisung bewirkt, dass der SQL-Parser die SQL nur einmal parst
  2. das Batching minimiert die Client-Server-Roundtrips, so dass nicht einer für jedes Update
  3. Die Kommunikation zwischen Client und Server wird minimiert, da das SQL nur einmal übertragen wird und die Daten gesammelt und als Paket (oder zumindest weniger Pakete) versendet werden

Außerdem:

  • Bitte überprüfen Sie, ob die Datenbankspalte profileId verwendet einen Index, damit das Nachschlagen der entsprechenden Zeile schnell genug ist
  • Sie können überprüfen, ob Ihre Verbindung auf Auto-Commit eingestellt ist. Versuchen Sie in diesem Fall, die automatische Festschreibung zu deaktivieren und die Transaktion explizit festzuschreiben, nachdem alle Zeilen aktualisiert wurden. Auf diese Weise könnten auch die einzelnen Aktualisierungsvorgänge schneller sein.