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 () - вставьте и выберите.