PHP大批量插入数据库的3种方法和速度对比,3种方法分别使用普通循环insert语句、事务提交和拼接sql字符串insert into语句。

<?php

// 连接数据库

header('content-type:text/html;charset=utf-8');

define('DB_HOST','127.0.0.1');

define('DB_USER','root');

define('DB_PASS','root');

define('DB_NAME','test');

define('DB_PORT',3306);

define('DB_CHAR','utf8');

define('APPNAME','');

$sqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);

$sqli->query( "SET NAMES ".DB_CHAR );


ini_set("max_execution_time", "30");

 

/**

 * 批量添加 方法1

 * 使用insert into循环遍历添加

 */

 

for ( $i = 0; $i<2000000; $i++){

    $sql = "INSERT INTO test_md5(`data`,`mda5_data`) VALUE (".$i.",'".md5($i)."')";

    $sqli->query( $sql );

}

//最后显示为:23:25:05 01:32:05 也就是花了2个小时多


 

/**

 * 批量添加 方法2

 * 使用事务提交,批量插入数据库(每隔10W条提交下)

 */

 

$sqli->query( 'start transaction' );

for( $i=0;$i<=2000000;$i++ ){

    $sql = "INSERT INTO test_md5(`data`,`md5_data`) VALUE (".$i.",'".md5($i)."')";

    // echo $i.'=>'.$sql.'<br/>';

    $sqli->query( $sql );

    if($i%10000==0){

        $sqli->query('commit transaction');

        $sqli->query('begin');

    }

}

$sqli->query('commit transaction');

//最后显示消耗的时间为:22:56:13 23:04:00 ,一共8分13秒 


/**

 * 批量添加 方法3
 * 
 * 使用优化SQL语句,将SQL语句拼接使用 insert into table() values(),(),()然后一次性添加;如果字符串太长,
 * 
 * 则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet =  2*1024*1024*10;
 */

 

ini_set("max_execution_time", "200000");

echo $time_s = date("H:i:s",time())."<br/>";

$sql = "INSERT INTO test_md5(`data`,`md5_data`) VALUES ";

for ( $i = 1 ; $i<2000000; $i++ ){

    $data_md5 = md5($i);

    $sql .= "( ".$i.",'".$data_md5."'),";

}

$sql = substr( $sql,0, strlen($sql)-1 );

// echo $sql;die();

$sqli->query( $sql );

echo $time_e = date("H:i:s",time())."<br/>";

//消耗时间为:11:24:06 11:25:06;插入200W条测试数据仅仅用了1分钟

注意

1:PHP的代码执行时间

max_execution_time = 200000

2:PHP每一次执行请求的内存空间

memory_limit = 1G

3:mysql接收的最大数据包

max_allowed_packet = 1G

总结

在插入大批量数据时, 第一种方法无疑是最差的,第二种方法在实际应用中就比较广泛,第三种方法在插入测试数据或者其他低要求时比较合适,速度最快。