【问题标题】:AgileToolkit - Performance of save() in Model_Table with referencesAgileToolkit - Model_Table 中 save() 的性能与参考
【发布时间】:2013-10-11 12:19:59
【问题描述】:

我正在使用 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() ?

【问题讨论】:

    标签: performance model save agiletoolkit


    【解决方案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() 时看到两个请求 - 插入和选择。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多