PHP快速导入数据到数据库
今天一朋友遇到将excel数据导入到mysql数据库,20多万条的数据导入到mysql需要两分多钟,老板认为这个速度太慢了,于是我们就一起想办法,最终把时间缩短到13秒左右,这里把解决问题的经过给大家做个分享.
两分钟是这样的:用phpexcel读取文件,然后通过foreach循环使用tp的插入数据库方法
测试1,读取phpexcel,然后做个循环,不插入数据库就需要1分多钟,于是就意识到读取excel太花时间,那么有没有更好的文件可以读取呢
测试2,通过搜索,可以通过PHP直接读取csv格式的文件,于是,换成csv的文件读取,时间少了一半,但仍然觉得时间太久
测试3,tp插入数据库的方法比较花时间,然后换成原来php连接插入数据库,时间再次所短一半,这个时候还需要30多秒,能不能再减少了
测试4,思考:既然循环需要时间,那么是否可以大批量插入呢,经过搜索,原来sql语句还可以这样写:
INSERTtable_name(column1,column2,...,columnN)VALUES(rec1_val1,rec1_val2,...,rec1_valN),
(rec2_val1,rec2_val2,...,rec2_valN),
......
(recM_val1,recM_val2,...,recM_valN);这里可以写多行哟,我写了1万行,没有问题
测试5,把20多万分成20多次分批导入,时间再次缩短了很多,最终13秒搞定[本人电脑配置一般,电脑好应该会再快一些]
代码如下:
两分钟是这样的:用phpexcel读取文件,然后通过foreach循环使用tp的插入数据库方法
测试1,读取phpexcel,然后做个循环,不插入数据库就需要1分多钟,于是就意识到读取excel太花时间,那么有没有更好的文件可以读取呢
测试2,通过搜索,可以通过PHP直接读取csv格式的文件,于是,换成csv的文件读取,时间少了一半,但仍然觉得时间太久
测试3,tp插入数据库的方法比较花时间,然后换成原来php连接插入数据库,时间再次所短一半,这个时候还需要30多秒,能不能再减少了
测试4,思考:既然循环需要时间,那么是否可以大批量插入呢,经过搜索,原来sql语句还可以这样写:
INSERTtable_name(column1,column2,...,columnN)VALUES(rec1_val1,rec1_val2,...,rec1_valN),
(rec2_val1,rec2_val2,...,rec2_valN),
......
(recM_val1,recM_val2,...,recM_valN);这里可以写多行哟,我写了1万行,没有问题
测试5,把20多万分成20多次分批导入,时间再次缩短了很多,最终13秒搞定[本人电脑配置一般,电脑好应该会再快一些]
代码如下:
$filepath = EXTEND_PATH."ccc.csv";
$dsn = "mysql:host=localhost;dbname=aftts";
$db = new \PDO($dsn, 'root', 'root'); //PHP Data Object
$db->exec("SET names 'utf8'");//保证数据库添加不出现乱码
$start = time(); //csv 导入数据开始
$file = fopen($filepath,'r');
$data = fgetcsv($file);
$sql = "INSERT INTO tp_test (a, b,c,d,e,f,g) VALUES";
$s = "";
$i=1;
while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容
$a = $data[0];
$b = $data[1];
$c = iconv('gb2312','utf-8',$data[2]); //中文转码,否则乱码
$d = $data[3];
$e = iconv('gb2312','utf-8',$data[4]);
$f = $data[5];
$g = iconv('gb2312','utf-8',$data[6]);
if($i000)//一次性给数据库过大,数据库受不了的 {
$s .= "('$a','$b','$c','$d','$e','$f','$g'),";
} else{
$dd[] = $sql . substr($s,0,strlen($s)-1);
$s = "('$a','$b','$c','$d','$e','$f','$g'),";
$i = 1;
}
$i++;
}
if($i<10000){
$dd[] = $sql . substr($s,0,strlen($s)-1);
}
foreach ($dd as $sql) {
$db->exec($sql);
}