7

私は質問があります: 私は Yii と InnoDB で大きなアプリケーションを構築しましたが、挿入/更新に非常に長い時間がかかるという問題に遭遇しました。これが私の php レポートです:

INNODB: admin ユーザー更新 55.247464895248 秒 ekuskov ユーザー更新 13.282548904419 秒 doriwall ユーザー更新 0.002094030380249 秒

MYISAM: 管理者 ユーザー更新 7.8317859172821 秒 ekuskov ユーザー更新 1.6304929256439 秒 doriwall ユーザー更新 0.0020859241485596 秒

挿入/更新を高速化するための解決策を誰かが提案できますか?

編集 - - - - - - - - - - - - - - - - - - - - - - -

今、私はいくつかの非常に単純な挿入ループを使用しました:

public function run($args) {
    $time = -microtime(true);

    $begin    = DateTime::createFromFormat('Y-m-d H:i:s', '2010-01-01 00:00:00');
    $end    = DateTime::createFromFormat('Y-m-d H:i:s', '2013-01-01 00:00:00');
    $end->add(new DateInterval('P1D'));
    $interval = DateInterval::createFromDateString('1 day');
    $days     = new DatePeriod($begin, $interval, $end);


    foreach ( $days as $day ) {
        echo "i";
        $track = new TimeTracking();
        $track->user_id = 25;
        $track->date = $day->format('Y-m-d H:i:s');
        $track->active = 4;
        $track->save(false);
    }

    $time += microtime(true);
    echo count($days)." items insert - $time seconds\n";
}

そして今INSERT時間は次のとおりです:

InnoDB: アイテムの挿入 - 72.269570827484 秒

MyISAM: アイテムの挿入 - 0.87537479400635 秒

[編集]そして今、私は SAVE メソッド全体と Yii モデルの「save()」関数の時間を数えていました:

更新: モデル -> 保存 (false) - 0.1096498966217 秒

更新: コントローラーの保存機能 () - 0.1302649974823 秒

作成: モデル -> 保存 (false) - 0.052282094955444 秒

CREATE: コントローラー保存関数 () - 0.057214975357056 秒

save() メソッドだけでこんなに時間がかかるのはなぜですか?

[編集]私は save() と command() をテストしましたが、それらは同じです:

$track->save(false);

また

$command = Yii::app()->db->createCommand();
            $command->insert('timeTracking', array(
                    'id'=>NULL,
                    'date'=>$track->date,
                    'active'=>$track->active,
                    'user_id'=>$track->user_id,
            ));

編集------------------------------

以下は、1,097 個のオブジェクトを挿入した場合の統計です。

save(): 0.86-0.94, 
$command->insert(): 0.67-0.72,
$command->execute(): 0.46-0.48,
mysql_query(): 0.33-0.36

最終的な回答:大規模な INSERT または UPDATE メソッドを使用する場合は、直接 MYSQL 呼び出しを使用して関数を作成することを検討する必要があります。実行時間のほぼ 70% を節約できます。

よろしく、

エドガー

4

6 に答える 6

1

挿入と更新でクロールするテーブルは、インデックスに少し夢中になっていることを示している可能性があります。DB は、コミットのたびにインデックスを停止して再コンパイルする必要があることに注意してください。

于 2013-09-24T15:46:15.553 に答える
0

MySQL のスペシャリストが言うように、MyISAM が必要であることを明示的に証明できるまでは InnoDB を使用してください。パフォーマンスの問題は良い議論ではありません。

大きなアプリケーションの場合、テーブル レベルのロックとデータの不整合の問題に直面する可能性があります。したがって、 InnoDB を使用します

パフォーマンスの問題は、インデックスまたはハードディスクの不足とそのファイル システムの問題に関連している可能性があります。

私は、いくつかの接続から絶えず更新および挿入される何億行ものテーブルを扱っていました。これらのテーブルには InnoDB エンジンがありました。

もちろん、まとめて追加する必要があるデータがある場合は、1 つの挿入ステートメントを使用してそれらを追加します。

于 2014-04-28T07:14:50.407 に答える
0

Yii と InnoDB を使用すると、次のようにコマンドをトランザクションでラップする必要があります。

$transaction = Yii::app()->db->beginTransaction();

try {
    // TODO Loop through all of your inserts

    $transaction->commit();
} catch (Exception $ex) {
    // There was some type of error. Rollback the last transaction
    $transaction->rollback();
}
于 2013-04-05T22:12:01.633 に答える