Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mise à jour de plusieurs lignes d'une seule table

Si chaque ligne doit obtenir une valeur différente qui ne peut pas être dérivée des données existantes dans la base de données, vous ne pouvez pas faire grand-chose pour optimiser la complexité globale. Alors ne vous attendez pas à trop de merveilles.

Cela dit, vous devriez commencer à utiliser des instructions préparées et à traiter par lots :

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
}

Qu'est-ce que cela fait :

  1. l'instruction préparée oblige l'analyseur SQL à analyser le SQL une seule fois
  2. le traitement par lots minimise les allers-retours client-serveur afin qu'il n'y en ait pas un pour chaque mise à jour
  3. la communication entre le client et le serveur est minimisée car le SQL n'est transmis qu'une seule fois et les données sont collectées et envoyées sous forme de paquet (ou au moins moins de paquets)

En plus :

  • Veuillez vérifier si la colonne de base de données profileId utilise un index pour que la recherche de la ligne correspondante soit assez rapide
  • Vous pouvez vérifier si votre connexion est définie sur la validation automatique. Si tel est le cas, essayez de désactiver la validation automatique et de valider explicitement la transaction après la mise à jour de toutes les lignes. De cette façon, les opérations de mise à jour unique pourraient également être plus rapides.