AgileToolkit - выполнение save() в Model_Table со ссылками

Я использую AgileToolkit 4.2.4 и испытываю некоторые проблемы с производительностью при использовании Model_Table для вставки большого количества элементов в базу данных MySQL 5.5.31 с движком InnoDB. После некоторого тестирования я обнаружил, что модель становится медленной при использовании ссылок, например, с 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 (2,7 секунды на 500 вставок):

<?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 (21,3 сек для 500 вставок):

<?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() внутри цикла?

1 ответ

Попробуй это

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

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

Метод save () сохраняет данные и снова загружает их из базы данных, чтобы заполнить вашу модель (так выглядит поле автоинкремента id в модели). С другой стороны, saveAndUnload() не выбирает никаких данных из базы данных после сохранения. Если вы добавите ->debug() к вашей модели, вы увидите два запроса при использовании save () - вставьте и выберите.

Другие вопросы по тегам