sql >> Databáze >  >> RDS >> Mysql

Aktualizace více řádků jedné tabulky

Pokud by každý řádek měl získat jinou hodnotu, kterou nelze odvodit z existujících dat v databázi, nemůžete udělat mnoho pro optimalizaci celkové složitosti. Nečekejte tedy příliš mnoho zázraků.

To znamená, že byste měli začít používat připravené příkazy a dávkování:

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
}

Co to dělá:

  1. připravený příkaz způsobí, že analyzátor SQL analyzuje SQL pouze jednou
  2. dávkování minimalizuje zpáteční cesty klient-server, takže pro každou aktualizaci není jeden
  3. Komunikace mezi klientem a serverem je minimalizována, protože SQL se přenáší pouze jednou a data se shromažďují a odesílají jako pakety (nebo alespoň méně paketů)

Navíc:

  • Zkontrolujte, zda sloupec databáze profileId používá index, takže vyhledání příslušného řádku je dostatečně rychlé
  • Můžete zkontrolovat, zda je vaše připojení nastaveno na automatické potvrzení. Pokud ano, zkuste deaktivovat automatické potvrzení a explicitně potvrdit transakci po aktualizaci všech řádků. Tímto způsobem by operace jedné aktualizace mohly být také rychlejší.


  1. Funkce v SQL Server 2008 podobná GREATEST v mysql?

  2. MySQL - Potíže s vytvořením uživatelem definované funkce (UDF)

  3. MariaDB se po aktualizaci nemůže spustit:[Upozornění] Nelze vytvořit testovací soubor /home/mysql/beta.lower-test

  4. Jak naplnit hodnoty cizích klíčů v konfiguraci Hibernate + Spring JPA, když jsou současně zachovány nadřazené/podřízené objekty?