Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Aktualizacja wielu wierszy pojedynczej tabeli

Jeśli każdy wiersz powinien otrzymać inną wartość, której nie można wyprowadzić z istniejących danych w bazie danych, niewiele można zrobić, aby zoptymalizować ogólną złożoność. Więc nie oczekuj zbyt wielu cudów.

To powiedziawszy, powinieneś zacząć używać przygotowanych wyciągów i grupowania:

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 robi:

  1. przygotowana instrukcja powoduje, że parser SQL parsuje SQL tylko raz
  2. przetwarzanie wsadowe minimalizuje przeloty w obie strony klient-serwer, tak że nie jedna dla każdej aktualizacji
  3. Komunikacja między klientem a serwerem jest zminimalizowana, ponieważ SQL jest przesyłany tylko raz, a dane są gromadzone i wysyłane jako pakiet (lub przynajmniej mniej pakietów)

Ponadto:

  • Sprawdź, czy kolumna bazy danych profileId używa indeksu, dzięki czemu wyszukiwanie odpowiedniego wiersza jest wystarczająco szybkie
  • Możesz sprawdzić, czy połączenie jest ustawione na automatyczne zatwierdzanie. Jeśli tak, spróbuj wyłączyć automatyczne zatwierdzanie i jawnie zatwierdź transakcję po zaktualizowaniu wszystkich wierszy. W ten sposób operacje pojedynczej aktualizacji mogą być również szybsze.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj PHP, aby zrzucić wartości mysql do pliku JSON

  2. MySQL - Licznik w grupie

  3. Komponowanie stosu — uproszczenie wdrażania kontenerów MySQL przez Docker

  4. Czy jest jakiś błąd rejestrowania, gdy zapytanie mysql nie powiedzie się?

  5. Jak wyprowadzić połączone wyniki z dwóch tabel MySQL za pomocą PDO?