Php foreach插入Mysql数据库的速度非常慢,特别是插入超过100K条记录和超过100K条记录时

Php foreach插入Mysql数据库的速度非常慢,特别是插入超过100K条记录和超过100K条记录时,php,mysql,codeigniter,Php,Mysql,Codeigniter,我怎样才能使这个代码更快。在数据库中插入100条记录是可以的,但插入500K条记录需要很长时间。 我尝试在代码中使用内爆,但它不起作用。 代码似乎有两个foreach循环,一个在另一个内部,但我找不到一种方法使其工作,有人有想法吗? 我的框架是codeigniter 下面是代码的样子: <?php function Add_multiple_users($values) { $err = ''; foreach($values as $rows) {

我怎样才能使这个代码更快。在数据库中插入100条记录是可以的,但插入500K条记录需要很长时间。 我尝试在代码中使用内爆,但它不起作用。 代码似乎有两个foreach循环,一个在另一个内部,但我找不到一种方法使其工作,有人有想法吗? 我的框架是codeigniter

下面是代码的样子:

<?php  
 function Add_multiple_users($values)
{
    $err = '';
    foreach($values as $rows)
    {
        $clientQuery = 'INSERT INTO
                            client
                            (
                                admin_id,
                                create_time
                            )
                            VALUES
                            (
                                "'.$this -> session -> userdata('user_id').'",
                                "'.date('Y-m-d H:i:s').'"
                            )';
        $clientResult = @$this -> db -> query($clientQuery);
        if($clientResult)
        {
            $client_id = $this -> db -> insert_id();
            foreach($rows as $row)
            {
                $attrQuery = 'INSERT INTO
                                    client_attribute_value
                                    (
                                        attribute_id,
                                        client_id,
                                        value
                                    )
                                    VALUES
                                    (
                                        "'.$row['attribute_id'].'",
                                        "'.$client_id.'",
                                        "'.addslashes(trim($row['value'])).'"
                                    )';
                $attrResult = @$this -> db -> query($attrQuery);
                if(!$attrResult)
                {
                    $err .= '<p class="box error">Could not add attribute for<br>
                            Attribute ID: '.$row['attribute_id'].'<br>
                            Client ID: '.$client_id.'<br>
                            Attribute Value: '.trim($row['value']).'</p>';
                }
            }
        }
    }
    return $err;
}
?>
客户端表示例:

客户端属性值表示例:

我猜您正在与数据库建立多个连接,尝试打开一个并保留为所有更改打开的资源,然后仅在过程结束时关闭它。

回答我自己的问题,希望这对以后的其他人有所帮助

在codeigniter/framework的model.php文件中添加以下内容:

$this->db->trans_start();

   MY CODE

$this->db->trans_complete();
问题已解决。:)
它加快了我将记录插入数据库的速度,在30秒内大约有15K条记录。

批量插入不起作用吗?或者你有什么问题?顺便问一下,什么是长时间?分钟?小时?500k行是相当大的数据量500k记录在我的服务器上最多需要2小时。我想我尝试的代码是hungs,因为我添加了一个array(),因为第一个foreach循环将数据插入客户机表,但第二个for each循环停止了代码。我只是想使用内爆选项加快数据库的插入速度。每个用户有多少个属性?我将首先重写脚本,并使用带有占位符的准备好的语句。在foreach之前准备语句,绑定参数并在循环中执行语句。在内部foreach中,使用多个值执行单个插入。根据具体情况,有时可能会有2、4、6、10等。它们是根据要加载到的csv列表创建的database@chap你误解我了。我的意思是:每个用户少于100个属性不应该是
INSERT的问题。。。值(),(),…,()
,而不是内部foreach中的一系列查询。因此,每个用户只有两个查询。你知道怎么做吗,我的应用程序在一个CodeIgniter框架上我不知道这个框架,但是,如果你看一下它的代码(如果你有一个未压缩的代码),也许你会发现一个mysql\u connect语句,它返回一个资源,尽量保留此资源并避免不必要的重复连接这对您有何帮助?
$this->db->trans_start();

   MY CODE

$this->db->trans_complete();