2

そのため、1 つの行 (assigned_user_id) を新しい ID に更新する「メモ」フィールドがあります。注記は約です。長さ160k。users テーブルは約 300 です。

メモの行ごとに、assigned_user_id をユーザー テーブルと比較し、一致が見つかった場合は、新しいユーザー ID を取得してメモ テーブルを更新します。すすぎの繰り返し:

//dis-allow timeout. Was timing out consistently under 100 rows changes.
set_time_limit(0);
ignore_user_abort(1);

//foreach note
$counter = 0;
foreach ( $msCRMAnnotations as $key=>$value)
{

    //foreach user, check for match between assigned_user_id and id_mscrm
    foreach( $sugarCRMUsers as $key2=>$value2 )
    {
        if($value['assigned_user_id'] == $value2['id_mscrm'] )
        {
            //give some output as to what is changing...
            echo("Note #"  . $counter++ . " - Note id " . $value['id'] . "  is assigned to user " . $value2['user_name'] . ".<br />" );

            $query = "
                UPDATE `notes`
                SET `assigned_user_id` = '" . $value2['id'] . "'
                WHERE `id` = '" . $value['id'] . "' AND
                `assigned_user_id` = '" . $value['assigned_user_id'] . "'
            ";
            $DB->query($query);
            //unset($query);
        }
    }
}

具体的には、選択したデータを MsCRM から SugarCRM に移行しています。これは、プロジェクトのアカウント/メモ/ユーザー フェーズです。

では、問題は....どうすれば上記のコードをリファクタリングしてパフォーマンスを向上させることができるでしょうか? どんな助けでも大歓迎です。

4

2 に答える 2

2

コメントから推測:

検索を高速化するために、これらの列にインデックスを設定してみてください。

于 2012-08-28T17:44:08.787 に答える
0

準備済みステートメントを使用すると役立つ場合があります。PDO::prepareを参照してください。

$stmt = $pdo->prepare($query);
...
foreach (...) {
   $stmt->execute($params);
}
...

また、REPLACEコマンドを使用して、一度に複数の更新を発行することもできます。主キーの実装方法によっては、これが機能する場合と機能しない場合があります。

REPLACE INTO `notes` (`id`, `assigned_user_id`)
VALUES
(?, ?),
(?, ?),
(?, ?),
(?, ?),
(?, ?)

... ID と assigned_user_ids を含む一連のパラメーターも必要です。

[編集] PDO は、準備されたステートメントをエミュレートすることを決定する場合があります。でこれをオフにすることができます$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE)。これを両方の方法でプロファイリングして、最適な方法を確認してください。

于 2012-08-28T17:14:25.207 に答える