sql >> Database >  >> RDS >> Mysql

Meerdere rijen enkele tabel bijwerken

Als elke rij een andere waarde zou moeten krijgen die niet kan worden afgeleid uit de bestaande gegevens in de database, kun je niet veel doen om de algehele complexiteit te optimaliseren. Verwacht dus niet te veel wonderen.

Dat gezegd hebbende, zou u voorbereide verklaringen en batchverwerking moeten gaan gebruiken:

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
}

Wat dit doet:

  1. de voorbereide instructie zorgt ervoor dat de SQL-parser de SQL slechts één keer ontleden
  2. de batchverwerking minimaliseert de client-server-roundtrips, zodat niet één voor elke update
  3. de communicatie tussen client en server wordt geminimaliseerd omdat de SQL slechts één keer wordt verzonden en de gegevens worden verzameld en verzonden als een pakket (of in ieder geval minder pakketten)

Bovendien:

  • Controleer of de databasekolom profileId gebruikt een index zodat het opzoeken van de betreffende rij snel genoeg gaat
  • Je zou kunnen controleren of je verbinding is ingesteld op automatisch vastleggen. Als dat het geval is, probeer dan auto-commit uit te schakelen en de transactie expliciet vast te leggen nadat alle rijen zijn bijgewerkt. Op deze manier zouden de enkele update-bewerkingen ook sneller kunnen zijn.


  1. SQL Server-equivalent van de functie substring_index in MySQL

  2. Maximum aantal tekens in labels (tabelnamen, kolommen enz.)

  3. Taal voor SQL-gegevensmanipulatie

  4. Probleem bij het uitvoeren van een MySQL-verwijderinstructie in Java