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";
}
现在,插入时间如下:
InnoDB:项目插入-72.269570827484秒
MyISAM:项目插入-0.87537479400635秒
[编辑] 现在我计算整个保存方法和Yii模型的“save()”函数所需的时间:
更新:model->save(false)-0.1096498966217秒
更新:控制器保存函数()-0.1302649974823秒
创建:model->save(false)-0.052282094955444秒
创建:控制器保存函数()-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%的执行时间。
祝好,
Edgar
timeTracking
表中,字段为(id
,date
,active
,user_id
),值分别为 (NULL, $track->date, $track->active, $track->user_id)。注:底部我写了该命令的确切指令。 - ekussberg