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

Opdatering af flere rækker af en enkelt tabel

Hvis hver række skulle få en anden værdi, som ikke kan udledes af de eksisterende data i databasen, er der ikke meget du kan gøre for at optimere den overordnede kompleksitet. Så forvent ikke for mange vidundere.

Når det er sagt, bør du begynde at bruge forberedte udsagn og 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
}

Hvad dette gør:

  1. den forberedte sætning får SQL-parseren til kun at parse SQL'en én gang
  2. batchningen minimerer klient-server-rundturene, så der ikke er én for hver opdatering
  3. kommunikationen mellem klient og server er minimeret, fordi SQL'en kun transmitteres én gang, og dataene indsamles og sendes som en pakke (eller i det mindste færre pakker)

Derudover:

  • Tjek venligst, om databasekolonnen profileId bruger et indeks, så det er hurtigt nok at slå den respektive række op
  • Du kan tjekke, om din forbindelse er indstillet til automatisk commit. Hvis det er tilfældet, prøv at deaktivere auto-commit og eksplicit begå transaktionen, efter at alle rækker er opdateret. På denne måde kunne de enkelte opdateringsoperationer også være hurtigere.


  1. Konverter mysql til mysqli?

  2. nvarchar(max) vs NText

  3. Installer mysqldb på sneleopard

  4. MySQL UNION-klausul