本次做一个小案例,就是做个excel导入,如果有重复的,就加随机数导入,要求不重复,数据量至少10W+,楼主是这样想的,在插入的时候,可以优化insert语句批量插入,或者写入txt文本,然后直接使用shell脚本用source命令导入,这两种方式是楼主想到的比较快的方法了。下面请看下简陋的测试例子:
本次使用了phpexcel组件。
$filename='test.xlsx';
$objReader = PHPExcel_IOFactory::createReader('Excel2007');//use excel2007 for 2007 format
$objPHPExcel = $objReader->load($filename); //$filename可以是上传的文件,或者是指定的文件
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
$filename=str_replace('.xlsx', '.csv',$filename);
$objWriter->save($filename);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
unset($sheetData[1]);
//去重
function deep_in_array($value, $array) {
foreach($array as $item) {
if(!is_array($item)) {
if ($item == $value) {
return true;
} else {
continue;
}
}
if(in_array($value, $item)) {
return true;
} else if(deep_in_array($value, $item)) {
return true;
}
}
return false;
}
$sql = Mysql_Query("select username,mobile from users ORDER by id asc");
$sqlData = array();
while ($result = mysql_fetch_array($sql)){
$sqlData[] = $result;
}
foreach($sheetData as $k => $data){
$rank=rand(1,999);
if(deep_in_array($data['A'],$sqlData)){
$data['A']=$data['A'].$rank;
}
$sheetData[$k]=$data;
}
//echo '<pre>';var_dump($sheetData);die;
$insql = "insert into users(`username`,`mobile`) values ";
$insql1 = "insert into users(`username`,`mobile`) values ";
$count = count($sheetData);
foreach($sheetData as $k => $data){
$insql .= '("'.$data['A'].'","'.$data['B'].'"),';
//一次插入1000条数据 减少数据库压力 或者保存到文件中 利用source 命令插入数据库
$a=$k+1;
if(($a%1000) == 0){
$insql = rtrim($insql,',').';'; //将最后的逗号替换成分号
//插入数据库 并且需要重置字符串 $insql
if(mysql_query($insql)){
echo 'success';
}else{
echo 'error';
}
//重置字符串 $insql
$insql = $insql1;
}
if($k-1 == $count){
$insql = rtrim($insql,',').';';
}
}
if(mysql_query($insql)){
echo 'insert success';
}else{
echo 'insert error';
}
亲测成功,速度很快,一千多条基本也就是页面一刷直接就好了。 其实还可以再最开始的时候讲比人传的文件强制换茬为csv文件,这样速度更快。