2013-02-18 2 views
7

対InnoDBは、私は疑問を持っている:私はYiiのInnoDBテーブルで大きなアプリケーションを構築し、問題に来ている、挿入/更新durate本当に長い時間が、ここに私のPHPのレポートであること:のYii Frameworkは - MyISAMの

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

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

誰もが挿入/更新を高速化するいくつかのソリューションを提案できますか?

EDIT ---------------------------------------------項目が挿入 - 0.87537479400635: -

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の項目が挿入 -

は今、私はいくつかの非常に単純なインサートループを使用しました秒

[EDIT]そして今、私は全体のSAVE方法とYiiのモデルのための時間をカウントして "(保存)" 機能:

UPDATE:モデル - >(false)を保存 - 0.1096498966217秒

UPDATE :セーブ機能コントローラ() - 0.1302649974823秒

は、CREATE:モデル - >(false)を保存 - 0.052282094955444秒

CREATE:セーブ機能コントローラ() - 0.057214975357056秒

なぜsave()メソッドに時間がかかりますか?

[EDIT]私は命令対()保存テストしている()と彼らdurate同じ:

$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, 
      )); 

EDIT ------ -----------------------

ここに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 

FINALLY答え:を、あなたが実行時間のほぼ70%を保存しますが、直接MYSQLコールで関数を作成するために検討すべきいくつかの大規模なINSERTまたはUPDATEメソッドを使用したい場合。あなたがそうのようなトランザクションであなたのコマンドをラップする必要がありYiiのInnoDBテーブルで

よろしく、

エドガー

+0

これは正しくはありません。たぶんあなたはあなたの質問をチェックする必要があります。管理者、ekuskov、doriwallユーザーの違いは何ですか? –

+0

テーブル構造を投稿できますか? – DarkMukke

+0

http://d.pr/i/P6zp この関数は、各ユーザーの残高を更新するだけです。 – ekussberg

答えて

0

$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(); 
} 
0

ソリューションでした:あなたは大きな挿入を必要とするこれらのテーブルのためにクイックレスポンスをMyISAMに変換します。さもなければ、ユーザは長い時間を待たなければならず、PHP Max Script Execution Timeがあなたのスクリプトを止めるという脅威があります。

0

InnoDBは多くの点でMyISAMよりはるかに複雑で機能豊富なエンジンです。それはそれを遅くし、クエリ、設定などでそれを修正するためにできることはあまりありません。しかし、MySQLは最近の更新でこのギャップを埋もうとしています。バージョン5.6で

ルック:

http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html

あなたの最善の策は、あなたが背後にいる場合、MySQLのバージョンをアップグレードすることであってもよいです。

1

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

0

InnoDBは、データベースをより速くする関係と制約を作成するオプションを提供し、これらの関係でモデル&を生成することができます。

また、クエリを小さなものに分割し、それらを1つずつ実行することも考えられます。

0

MySQLの専門家によると、MyISAMが必要であることを明示的に証明できるまで、InnoDBを使用してください。 パフォーマンスの問題はあまりよくありません。

大きなアプリケーションを使用している場合は、おそらくテーブルレベルのロックとデータの不一致に問題があります。 InnoDBを使用してください。

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

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

もちろん、束に追加するデータがあります。挿入ステートメントを使って追加してください。