MySQL批量插入最大允许数据包

时间:2017-05-03 09:45:47

标签: php mysql mysqli

我是MySQL新手,我正在寻找这个问题的一些指导 我将大量数据输入MySQL表 我已使用此格式进行设置,因此VALUES处于循环中且INSERT部分仅发生一次:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

我已阅读过帖子:How to do a batch insert in MySQL

我正在尝试插入多达160,000行数据。 我的php脚本似乎在短时间内卡住了,只有6499行数据被插入到表中。

我认为我遇到Max_Allowed_Packet

的问题

我正在使用iPage托管,我在共享服务器上。我已经向iPage询问了Max_Allowed_Packet,但我告诉过,只有在虚拟专用服务器(VPS)上才能增加。{此项目不值得为私人服务器付费。

我正在寻找在共享服务器上插入所有这些数据的编码方式 一次提交1000行选项吗?
我不确定这是否是一个好的解决方案,我很感激任何想法。

以下是插入数据的代码部分:

 // prepare first part of the query (before values)
                      $query = " INSERT INTO `Events_testing2` (
                          `eventID`,
                          `location`,
                          `date`,
                          `barcode`,
                          `runner`,
                          `time`,
                          `Run Points`,
                          `Volunteer Points`,
                          `Gender`,
                          `Gender pos`
                      ) VALUES ";


                      //loop the runner array

                      for($x=0;$x<count($array_runner); $x++){
                          $query_values[] = "(' ','$location','$date','$array_barcode[$x]','$array_runner[$x]','$array_time[$x]','$array_score[$x]','','$array_gender[$x]','$array_gender_pos[$x]')";
                      }


                      // put the code together to insert to the DB

                      $queryInsertUser=mysqli_query($link,$query.implode(',',$query_values));

1 个答案:

答案 0 :(得分:0)

根据评论,如果您要使用预准备语句,则在尝试插入数千条记录时可能会发现性能差异。希望以下内容能够说明如何实现这一目标 - 尽管它当然未经测试。

<?php

    $dbhost =   'localhost';
    $dbuser =   'root'; 
    $dbpwd  =   'xxx'; 
    $dbname =   'xxx';
    $db =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );


    $sql='insert into `Events_testing2` (
      `eventID`,
      `location`,
      `date`,
      `barcode`,
      `runner`,
      `time`,
      `Run Points`,
      `Volunteer Points`,
      `Gender`,
      `Gender pos`
    ) values (?,?,?,?,?,?,?,?,?,?)';

    $stmt=$db->prepare( $sql );


    if( $stmt ){

        $stmt->bind_param('isssssiiss',$id,$location,$date,$barcode,$runner,$time,$runpoints,$volpoints,$gender,$genpos);
        /*
            $location & $date seem to be defined already
        */
        for( $x=0; $x < count( $array_runner ); $x++ ){
            $id=null;
            $barcode=$array_barcode[$x];
            $runner=$array_runner[$x];
            $time=$array_time[$x];
            $runpoints=$array_score[$x];
            $volpoints=null;
            $gender=$array_gender[$x];
            $genpos=$array_gender_pos[$x];


            $stmt->execute();
        }
        $stmt->close();
        $db->close();
    }
?>