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 自动增量字段在模型中出现的方式)。另一方面saveAndUnload()保存后不要从数据库中选择任何数据。如果您将->debug()添加到模型中,您将在使用save()时看到两个请求- 插入和选择。

于 2013-11-26T17:09:42.433 回答