Performance Codeigniter加速多查询更新?
我有200000行要更新。从使用其方法的测试来看,更新1000行需要7分钟,因此需要大约24小时才能完成:( 在Codeigniter中有没有比我使用的方法更快的方法Performance Codeigniter加速多查询更新?,performance,codeigniter,sql-update,Performance,Codeigniter,Sql Update,我有200000行要更新。从使用其方法的测试来看,更新1000行需要7分钟,因此需要大约24小时才能完成:( 在Codeigniter中有没有比我使用的方法更快的方法 for($c=1;$c<=200;$c++) { $limit = 1000; $offset = ($c*1000)-1000; if($c==1) { $query = $this->db->query("SELECT email,password,first_nam
for($c=1;$c<=200;$c++) {
$limit = 1000;
$offset = ($c*1000)-1000;
if($c==1) {
$query = $this->db->query("SELECT email,password,first_name,last_name FROM users WHERE email!='' ORDER BY id ASC LIMIT ".$limit);
} else {
$query = $this->db->query("SELECT email,password,first_name,last_name FROM users WHERE email!='' ORDER BY id ASC LIMIT ".$offset.",".$limit);
}
$appdb->trans_start();
foreach($query->result() as $row) {
$email = $row->email;
$password = $row->password;
$first_name = $row->first_name;
$last_name = $row->last_name;
$newpassword = password_hash($password, PASSWORD_DEFAULT);
$appdb->query("UPDATE users_user SET password='$newpassword',first_name='$first_name',last_name='$last_name' WHERE email='$email'");
}
$appdb->trans_complete();
}
for($c=1;$cdb->query(“选择电子邮件所在用户的电子邮件、密码、名字、姓氏!=''按id订购ASC限制”。$LIMIT);
}否则{
$query=$this->db->query(“从电子邮件所在的用户中选择电子邮件、密码、名字、姓氏!=''按id订购ASC限制”。$offset.,“$LIMIT”);
}
$appdb->trans_start();
foreach($query->result()作为$row){
$email=$row->email;
$password=$row->password;
$first\u name=$row->first\u name;
$last\u name=$row->last\u name;
$newpassword=password\u hash($password,password\u DEFAULT);
$appdb->query(“更新用户\u用户设置密码='$newpassword',first\u name='$first\u name',last\u name='$last\u name',其中email='$email');
}
$appdb->trans_complete();
}
该电子邮件是唯一的,因此我不能使用
update\u batch
我不是数据库专家,因此,我不会对此发表任何评论,但我知道的一件事是
您可以对一个动态字段使用update\u batch()
()但如果有多个字段,则
另一个故事。通过使用update\u batch()
您将逃脱多个
向DB
请求,这将略微提高您的性能,
如果不明显的话
我在下面写了一个演示代码,必要时会提到注释。看看它是否对您有帮助
for($i=1, $j=0; $i<=200; $i++){
$limit = 1000;
$offset = ($i*1000)-1000;
if($i == 1) {
$query = $this->db->query("SELECT email,password,first_name,last_name FROM users WHERE email!='' ORDER BY id ASC LIMIT ".$limit);
} else {
$query = $this->db->query("SELECT email,password,first_name,last_name FROM users WHERE email!='' ORDER BY id ASC LIMIT ".$offset.",".$limit);
}
foreach($query->result() as $row){ // save data in the array
$save[$j]['email'] = $row->email;
$save[$j]['first_name'] = $row->first_name;
$save[$j]['last_name'] = $row->last_name;
$save[$j]['password'] = password_hash($row->$password, PASSWORD_DEFAULT);
$j++; // increment array index
}
$appdb->trans_start();
$appdb->update_batch('users_user', $save, 'email'); // dynamic email field
$appdb->trans_complete();
$save = array(); // empty the array after each iteration
}
for($i=1,$j=0;$idb->query(“从用户那里选择电子邮件、密码、名字、姓氏,其中电子邮件!=''按id订购ASC限制”。$LIMIT);
}否则{
$query=$this->db->query(“从电子邮件所在的用户中选择电子邮件、密码、名字、姓氏!=''按id订购ASC限制”。$offset.,“$LIMIT”);
}
foreach($query->result()作为$row){//在数组中保存数据
$save[$j]['email']=$row->email;
$save[$j]['first\u name']=$row->first\u name;
$save[$j]['last\u name']=$row->last\u name;
$save[$j]['password']=密码\u散列($row->$password,密码\u默认值);
$j++;//增量数组索引
}
$appdb->trans_start();
$appdb->update_batch('users_user',$save,'email');//动态电子邮件字段
$appdb->trans_complete();
$save=array();//每次迭代后清空数组
}
对于多个动态字段,您必须创建自己的
update\u batch()
方法。请参阅。您是否为数据库中的字段电子邮件编制了索引?如果没有,它将加快查询速度。这解决了我的问题。大大减少了时间,谢谢。很高兴提供帮助。:)