1

AgileToolkit 4.2.4 を使用していますが、Model_Table を使用して大量の項目を InnoDB エンジンを使用して MySQL 5.5.31 データベースに挿入すると、パフォーマンスの問題が発生します。いくつかのテストの後、hasOne() などの参照を使用するとモデルが遅くなることがわかりました。

パフォーマンス テスト:

<?php
$t = $this->add('Model_Test');

for ($i = 0; $i < 500; $i++)
{
    $t->unload();

    $t->set('field1', 1);
    $t->set('field2', 1);

    $t->save();
}
?>

モデル 1 を使用 (500 回の挿入で 2.7 秒):

<?php
class Model_Test extends Model_Table
{
    public $table = 'test';

    function init()
    {
        parent::init();

        $this->addField('field1')->length(45);
        $this->addField('field2')->length(45);
    }
}
?>

モデル 2 を使用 (500 インサートで 21.3 秒):

<?php
class Model_Test extends Model_Table
{
    public $table = 'test';

    function init()
    {
        parent::init();

        $this->hasOne('Test', 'field1');
        $this->hasOne('Test', 'field2');
    }
}
?>

モデル 2 のこの例では、同じモデル Test のインスタンスを参照していますが、他のモデルを参照した場合にも発生します。

この問題を克服するために私にできることはありますか? さらに、これはモデルを使用してアイテムを挿入する正しい方法ですか。一度だけ追加して、ループ内で unload() を実行しますか?

4

1 に答える 1

0

これを試して

$t = $this->add('Model_Test');

for ($i = 0; $i < 500; $i++) {
    $t->set('field1', 1);
    $t->set('field2', 1);
    $t->saveAndUnload();     //  <--------
}

メソッドsave()はデータを保存し、それらをデータベースから再度ロードしてモデルに入力します (これは、id autoincrement フィールドがモデルにどのように表示されるかです)。一方、 saveAndUnload()は、保存後にデータベースからデータを選択しません。モデルに->debug()を追加すると、 save()を使用すると、insert と selectの 2 つのリクエストが表示されます。

于 2013-11-26T17:09:42.433 に答える