Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Codeigniter加速多查询更新?_Performance_Codeigniter_Sql Update - Fatal编程技术网

Performance 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

我有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_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()
方法。请参阅。

您是否为数据库中的字段
电子邮件编制了索引?如果没有,它将加快查询速度。这解决了我的问题。大大减少了时间,谢谢。很高兴提供帮助。:)