2017-10-03 9 views
0

PHP를 통해 CSV 파일을로드하고 임시 테이블에 삽입하는 중, 이것은 PHP 스크립트와 MySQL 쿼리를로드하는 것입니다. 빠른 Mysql 삽입하는 방법 nullif?

$i=0; 
    while (($data = fgetcsv($source, 1000, ",")) !== FALSE) 
     { 
      if($i!=0) { 
       $column1=$data[0]; 
       $column2=$data[1]; 
       $column3=$data[2]; 
       $column4=$data[3]; 
       $column5=$data[4]; 
       $column6=$data[5]; 
       $query= "INSERT INTO temp_table(column1,column2,column3,column4,column5,column6,load_datetime) 
    VALUES (nullif('$column1',''), nullif('$column2',''), nullif('$column3',''), nullif('$column4',''), nullif('$column5',''), nullif('$column6',''),now())"; 
       mysql_query($query) or die(mysql_error()); 
      } 
      $i++; 
     } 

내 CSV 파일이 내가 CSV 및에로드 할 때 내가 직면하고있는 문제는,이 10 분 이상 소요되는 내 CSV

 column1,column2,column3,column4,column5,column6 
     ,,,13:57:18,,23:00:19 

에서 샘플 행입니다 25000 개 기록, 있다 페이지 사이에 아무 것도 표시되지 않습니다. 내 PHP 설정 : upload_max_filesize : 100M post_max_size : 100M max_execution_time : 1000 max_input_time : 1000.

이 내 테이블 세부

CREATE TABLE temp_table (
     id int(11) NOT NULL, 
     column1 time DEFAULT NULL, 
     column2 time DEFAULT NULL, 
     column3 time DEFAULT NULL, 
     column4 time DEFAULT NULL, 
     column5 time DEFAULT NULL, 
     column6 time DEFAULT NULL, 
     load_datetime datetime DEFAULT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

와 내가 temp_table을 확인할 때 8000 개 기록 주위에 삽입했다. 더 빨리 삽입하는 방법을 알려주십시오.

답변

1

사용 MySQL의 확장 (mysql_로 *)
를 중지하고 사용 mysqli 또는 PDO을 시작 내가 당신에게 추천 할 것입니다.

몇 가지 rown의 데이터를 하나의 쿼리로 그룹화하십시오.

예 :

$i = 0; 
$i2 = 0; 
$sql = "INSERT INTO temp_table(column1,column2,column3,column4,column5,column6,load_datetime) VALUES "; 
$values = []; 
while (($data = fgetcsv($source, 1000, ",")) !== FALSE) { 
    if(++$i == 1) 
     continue; 
    else { 
     $data = array_map(function($item) { 
      return $item == '' ? 'NULL' : "'$item'"; 
     }, $data); 
     $values[] = "(" . implode(", ", $data) . ', now()' . ")"; 
     if (++$i2 == 500) { 
      mysql_query ($sql . implode(', ', $values)) or die(mysql_error()); 
      $values = []; 
      $i2 = 0; 
     } 
    } 
} 
if (!empty($values)) { 
    mysql_query ($sql . implode(', ', $values)) or die(mysql_error()); 
    $values = []; 
} 
+0

이전 지금 '지금()'을 (를) 추가하는 것을 잊었습니다. 도움이되지 않으면 생성 된 SQL'echo $ sql을 출력 해보십시오. implode (',', $ values)'. – Neodan

+0

솔루션은 2 분 미만의 시간이 소요되었으며 25000 개의 레코드가 삽입되었습니다. 정말 고맙습니다. – davidb

+0

@ davidb 1if (++ $ i == 1) 계속 진행하면, 첫 번째 행 건너 뛰기 (-; – Neodan

0

내가 뭔가 PHP 스크립트에 시간이 걸리는 것 같아요. 아래 코드를 시도해보고 개선 된 부분을 알려주고 한 번에 50 ~ 100 개의 레코드를 그룹화 할 수 있습니다.

while (($data = fgetcsv($source, 1000, ",")) !== FALSE) 
{ 
if($i!=0) 
{ 
$query= "INSERT INTO temp_table(column1,column2,column3,column4,column5,column6,load_datetime) 
VALUES (nullif('$data[0]',''), nullif('$data[1]',''), nullif('$data[2]',''), nullif('$data[3]',''), nullif('$data[4]',''), nullif('$data[5]',''),now())"; 
mysql_query($query) or die(mysql_error()); 
} 
$i++; 
} 
+0

나는 이것을 시험해 보았습니다. 이전과 같은 시간이 걸렸습니다. – davidb

+0

어떻게 알 수 있습니까? PHP 코드로 작성된 것과 똑같이 DB에서 직접 실행하는 동안 많은 시간이 걸릴 수 있습니까? – Jack

+0

또한 테이블 생성 코드에서 id는 자동 증가 필드이거나 기본값을 가져야합니다. – Jack