sql >> Databasteknik >  >> RDS >> Mysql

Uppdaterar flera rader i en tabell

Om varje rad skulle få ett annat värde som inte kan härledas från befintlig data i databasen, finns det inte mycket du kan göra för att optimera den övergripande komplexiteten. Så förvänta dig inte för många underverk.

Som sagt, du bör börja använda förberedda uttalanden och batchning:

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
}

Vad detta gör:

  1. den förberedda satsen gör att SQL-tolkaren endast analyserar SQL en gång
  2. batchningen minimerar klient-server-rundturerna så att inte en för varje uppdatering
  3. kommunikationen mellan klient och server minimeras eftersom SQL bara sänds en gång och data samlas in och skickas som ett paket (eller åtminstone färre paket)

Dessutom:

  • Kontrollera om databaskolumnen profileId använder ett index så att det går tillräckligt snabbt att slå upp respektive rad
  • Du kan kontrollera om din anslutning är inställd på auto-commit. Om så är fallet, försök att inaktivera auto-commit och explicit utföra transaktionen efter att alla rader har uppdaterats. På så sätt kan de enskilda uppdateringsoperationerna också vara snabbare.


  1. ComboBox.ValueMember och DisplayMember

  2. Sök i alla kolumner i en tabell med ett enda where-villkor med ett enda nyckelord i mysql

  3. Hur man hittar dubbletter av poster i MySQL

  4. Hanterar mysqldump binär data på ett tillförlitligt sätt?