我有一个问题:我用 Yii 和 InnoDB 构建了一个大型应用程序并遇到了问题,插入/更新持续时间真的很长,这是我的 php 报告:
INNODB:管理员用户更新 55.247464895248 秒 ekuskov 用户更新 13.282548904419 秒 doriwall 用户更新 0.002094030380249 秒
MYISAM:管理员用户更新 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";
}
现在插入时间如下:
InnoDB:项目插入 - 72.269570827484 秒
MyISAM:项目插入 - 0.87537479400635 秒
[编辑]现在我正在计算整个 SAVE 方法和 Yii 模型“save()”函数的时间:
更新:模型->保存(假)- 0.1096498966217 秒
更新:控制器保存功能 () - 0.1302649974823 秒
创建:模型->保存(假)- 0.052282094955444 秒
CREATE:控制器保存函数 () - 0.057214975357056 秒
为什么只是 save() 方法需要这么长时间?
[编辑]我已经测试了 save() 与 command() 并且它们的持续时间相同:
$track->save(false);
或者
$command = Yii::app()->db->createCommand();
$command->insert('timeTracking', array(
'id'=>NULL,
'date'=>$track->date,
'active'=>$track->active,
'user_id'=>$track->user_id,
));
编辑------------------
这是插入 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
最后回答:如果你想使用一些大规模的 INSERT 或 UPDATE 方法,你应该考虑使用直接 MYSQL 调用来创建函数,在那里你将节省近 70% 的执行时间。
问候,
埃德加