我有 200,000 行要更新。在使用其方法的测试中,更新 1,000 行需要 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_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();
}
电子邮件是唯一的,所以我不能使用update_batch
。
我不是数据库专家,所以我不会对此发表任何评论,但我确实知道的一件事是
您可以将
update_batch()
与一个动态字段一起使用 (参考资料(但是,如果有多个字段,那就是 另一个故事。通过使用update_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
}
对于多个动态字段,您必须创建自己的update_batch()
方法。看这里。