Yii框架 - InnoDB与MyISAM

eku*_*erg 7 mysql myisam innodb yii

我有一个问题:我已经用Yii和InnoDB构建了一个大应用程序并且遇到了问题,插入/更新管道确实很长时间,这是我的php报告:

INNODB:admin用户更新55.247464895248秒ekuskov用户更新13.282548904419秒doriwall用户更新0.002094030380249秒

MYISAM:admin用户更新7.8317859172821秒ekuskov用户更新1.6304929256439秒doriwall用户更新0.0020859241485596秒

任何人都可以建议一些解决方案,以加快插入/更新?

编辑----------------------------------------------

现在我使用了一些非常简单的插入循环:

public function run($args) {
    $time = -microtime(true);

    $begin    = DateTime::createFromFormat('Y-m-d H:i:s', '2010-01-01 00:00:00');
    $end    = DateTime::createFromFormat('Y-m-d H:i:s', '2013-01-01 00:00:00');
    $end->add(new DateInterval('P1D'));
    $interval = DateInterval::createFromDateString('1 day');
    $days     = new DatePeriod($begin, $interval, $end);


    foreach ( $days as $day ) {
        echo "i";
        $track = new TimeTracking();
        $track->user_id = 25;
        $track->date = $day->format('Y-m-d H:i:s');
        $track->active = 4;
        $track->save(false);
    }

    $time += microtime(true);
    echo count($days)." items insert - $time seconds\n";
}
Run Code Online (Sandbox Code Playgroud)

现在INSERT时间如下:

InnoDB:项目插入 - 72.269570827484秒

MyISAM:项目插入 - 0.87537479400635秒

[编辑]现在我正在计算整个SAVE方法和Yii模型"save()"函数的时间:

更新:model-> save(false) - 0.1096498966217秒

更新:控制器保存功能() - 0.1302649974823秒

CREATE:model-> save(false) - 0.052282094955444秒

CREATE:控制器保存功能() - 0.057214975357056秒

为什么只有save()方法需要这么长时间?

[编辑]我测试了save()vs command()并且他们执行相同的操作:

$track->save(false);
Run Code Online (Sandbox Code Playgroud)

要么

$command = Yii::app()->db->createCommand();
            $command->insert('timeTracking', array(
                    'id'=>NULL,
                    'date'=>$track->date,
                    'active'=>$track->active,
                    'user_id'=>$track->user_id,
            ));
Run Code Online (Sandbox Code Playgroud)

编辑 -----------------------------

这里有一个插入1,097个对象的统计信息:

save(): 0.86-0.94, 
$command->insert(): 0.67-0.72,
$command->execute(): 0.46-0.48,
mysql_query(): 0.33-0.36
Run Code Online (Sandbox Code Playgroud)

最后的答案:如果你想使用一些大量的INSERT或UPDATE方法,你应该考虑使用直接MYSQL调用创建函数,在那里你将节省近70%的执行时间.

问候,

埃德加

chr*_*don 0

使用 Yii 和 InnoDB 您应该将命令包装在事务中,如下所示:

$transaction = Yii::app()->db->beginTransaction();

try {
    // TODO Loop through all of your inserts

    $transaction->commit();
} catch (Exception $ex) {
    // There was some type of error. Rollback the last transaction
    $transaction->rollback();
}
Run Code Online (Sandbox Code Playgroud)