sql >> データベース >  >> RDS >> Mysql

単一のテーブルの複数の行を更新する

    すべての行がデータベース内の既存のデータから導出できない異なる値を取得する必要がある場合、全体的な複雑さを最適化するためにできることはあまりありません。ですから、あまり多くの不思議を期待しないでください。

    そうは言っても、プリペアドステートメントとバッチ処理の使用を開始する必要があります:

    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
    }
    

    これは何をしますか:

    1. プリペアドステートメントにより、SQLパーサーはSQLを1回だけ解析します
    2. バッチ処理により、クライアントサーバーのラウンドトリップが最小限に抑えられるため、更新ごとに1つになるわけではありません
    3. SQLは1回だけ送信され、データはパケット(または少なくとも少数のパケット)として収集および送信されるため、クライアントとサーバー間の通信は最小限に抑えられます。

    さらに:

    • データベース列profileIdかどうかを確認してください それぞれの行の検索が十分に高速になるように、インデックスを使用しています
    • 接続が自動コミットに設定されているかどうかを確認できます。その場合は、自動コミットを無効にして、すべての行が更新された後にトランザクションを明示的にコミットしてください。このようにして、単一の更新操作も高速になる可能性があります。


    1. geminstallpgはlibpqにバインドできません

    2. メタデータ検出ウィザードの使用

    3. OracleのCONCAT()関数

    4. MySQLのルートを誤ってロックアウトしました