2012-10-29 5 views
1

수천 개의 레코드를 삽입하고 싶습니다.이 레코드가 빠를 필요가 있습니다. 나는이 문제에 대해 많이 읽었으므로 나의 오래된 접근법 (mysql_connect)을 삭제하고 prepare 문과 mysqli를 사용하기로 결정했다. 그래서 이것의 속도를 테스트하기 위해 다음과 같이 씁니다. mysql에 천개의 레코드를 삽입하는 가장 빠른 방법은 무엇입니까?

function load_data2db($sms_id){ 
$mysqli = new mysqli('localhost', 'root', 'cr3at1ve', 'tmp-clicknsend'); 
/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 


// Create statement object 
$stmt = $mysqli->stmt_init(); 
if ($stmt = $mysqli->prepare("INSERT INTO isec_test (sms_id, status,msgid,prmsgid,mob,sms_history_id) values (?, ?, ?, ?, ?, ?)")) { 


     /* Bind our params */ 
     $stmt->bind_param('ssssss',$sms_id,$status,$msgid,$prmsgid,$mob,$sms_history_id); 

    for($i=0;$i<100000;$i++) 
    { 
     /* Set our params */ 
     $sms_id = "110"; 
     $status = "OK"; 
     $msgid = "msgid"; 
     $prmsgid = "100-0"; 
     $mob = "306974386068"; 
     $sms_history_id = 102; 

     /* Execute the prepared Statement */ 
     $stmt->execute(); 
    } 


     /* Close the statement */ 
     $stmt->close(); 
} 
else { 
     /* Error */ 
     printf("Prepared Statement Error: %s\n", $mysqli->error); 
} 
} 

load_data2db(10); 

은 그 때 나는 옛날 방식 (루프와 하나 하나를 삽입)

include("mysql_connect.php"); 
for($i=0;$i<100000;$i++) 
    { 
    $query = "INSERT INTO isec_test(sms_id,status,msgid) values ('1','OK','123-123')"; 
    $query = @mysql_query($query); 
    } 
mysql_close($dbc); 

내가 테스트를 많이 만들어 항상 간단한 MySQL의 방법은 1 초 빨랐다와 동일했다. 그래서 나는 당혹 스럽다. 내가 무엇을 할 수 있을지? LOAD DATA를 사용 하시겠습니까?

+2

은 100,000 개의 쿼리에 대해 1 초입니다. 실제로 많은 문제가 있습니까? –

+0

예. 나는 서버의 속도와 자원 (RAM)에 관심이있다. 이것은 100.000 * 50 명의 사용자에게 발생할 수 있습니다. 그래서 나는 mysqli가 왜 속도면에서 더 나은지 궁금해하고있다. (적어도 내가 읽었던 것) 나는 나의 테스트에서 그것을 볼 수 없다. –

+0

나는 mysql을 잘 모른다. 첫 번째 코드는 대량 삽입 (mssql과 같이)입니까? – Jaxedin

답변

2

삽입 할 때 행마다 일부 처리를 수행해야하는 경우가 아니면 LOAD DATA LOCAL INFILE을 사용하는 것이 좋습니다.

수천 번 SQL 쿼리를 다시 구문 분석 할 필요가 없기 때문에 SQL 문 준비 및 매개 변수 바인딩이 더 빠릅니다.

그러나 PHP 확장에는 응용 프로그램 측면에서 실행해야하는 약간의 코드가 포함되어 있습니다. mysqli 확장은 더 복잡 할 수 있으며 따라서 반복적 인 연산을 위해 이전 mysql 확장보다 약간 더 많은 오버 헤드로 실행된다.

PHP에서 단일 함수 호출의 오버 헤드는 루프에서 충분한 시간을 반복하면 눈에. 수 있습니다. 나는 사람들이이 두 문 사이에 측정 가능한 차이가있을 말해 했어 :

$x = (int) '123'; 
$x = intval('123'); 

두 번째 줄은 함수 호출이다, 그래서 (비록 아주 작은 차이로) 느리다.

+0

감사합니다. 이 LOAD DATA LOCAL INFILE을 찾고 있었지만 구문을 이해하는 데 어려움이 있습니다. 내가 읽을 수있는 공식 DOCS를 제외한 리소스/튜토리얼을 알고 있습니까? 내 문제는 내가 서버에서 응답을받을, 그래서 어딘가에 (배열에? 탭으로 구분 된 파일에 직접 저장해야합니까?) 모두 함께 구문 분석했다. –

+0

신경 쓰지 마라. 나는 마침내 시험을 보았다. 그리고 나는 그 차이를 믿을 수 없다. 50.000 개의 행을 삽입하기 위해 일반적인 mysql 루프는 11 초 만에 "LOAD DATA"명령을 2 초 만에 실행했다. 믿을 수 없는. –

+0

예, 두 가지 방법 사이에 경연이 없습니다. 행당 몇 가지 작업을 수행 할 필요가없는 한 (예 : 데이터 값을 변환하거나 행당 자동 생성 ID를 가져 오는 것. –

관련 문제