2012-04-12 6 views
1

일부 복잡한 데이터를 mysql 데이터베이스에 삽입하려고하지만 구현 성능에 문제가있다. 나는 내가 데이터베이스에 삽입 할 데이터의 전체 무리를받을복잡한 데이터를 효율적으로 삽입 mysql

users columns[userid, name,...] 
questions columns[questionid, userid, questiontext] 
answers columns[answerid, questionid, answertext] 

내 데이터베이스에 3 개 테이블을 정의이를 위해

user1 
    question1_1 
    answer1_1_1 
    answer1_1_2 
    answer1_1_3 
    ... 
    question1_2 
    answer1_2_1 
    answer1_2_2 
    ... 
    ... 
user 2 
... 

:처럼 내 데이터 보인다. 테이블이 연결되어 있기 때문에 사용자를 삽입하고 ID를 검색하여 질문에 VALUES를 사용하는 구현이 있습니다. 작동하지만 분리 된 수 때문에 최대 실행 시간이 30 초를 초과했습니다. mysql insert 문.

내 현재 코드는 다음과 같습니다

나는 이전 삽입의 ID가 다음 삽입 문에 사용되는 주어진 하나의 큰 statementm에 별도의 삽입 문을 결합 할 수있는 방법
for ($i=0; $i<sizeof($users); $i++) 
{ 
    $user = $users[$i]; 
    $sqlstr = "INSERT INTO users (username) VALUES ('".$users[$i]->id."')"; 

    mysql_query($sqlstr); 
    $userid = mysql_insert_id(); 

    for ($j=0; $j<sizeof($user->question); $j++) 
    { 
    $question = $user->question[$j]; 

    $sqlstr = "INSERT INTO question (userid,creator,date) VALUES (".$userid.",'".$question->creator."','".$question->date."')"; 

    mysql_query($sqlstr); 
    $questionid = mysql_insert_id(); 

    $rows = array(); 
    $sqlstr = "INSERT INTO answers (questionid,name,value) VALUES "; 
    for ($k=0; $k<sizeof($question->answers); $k++) 
    { 
     $rows[] = "('".$questionid."','".$question->answers[$k]->name."','".$question->answers[$k]->value."')"; 
    } 
    $sqlstr = $sqlstr.implode(',',$rows); 
    mysql_query($sqlstr); 
    } 
}  

? LAST_INSERT_ID() 실험했지만 예상대로 작동하지 않습니다. 그 테이블의 마지막 ID를 참조하는 것 같습니다.

아니면 다른 해결책이 있습니까?

+0

'LAST_INSERT_ID()'는 삽입 된 테이블에 관계없이 삽입 된 마지막 행의 ID를 반환해야합니다. 문제가있을 경우 잘못된 순서로 진술을 작성한 것입니다. 단일 문 (AFAIK)에서 여러 테이블에 삽입 할 수는 없지만 MySQL [UDF] (http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html)을 다음과 같이 작성할 수 있습니다. 해. 매우 오래 실행되는 PHP 스크립트를 가지고 있다면'set_time_limit (0);'을 잊지 마라. – DaveRandom

+0

질문에 현재 PHP 코드를 추가하십시오. – nnichols

+0

@DaveRandom 당신 말이 맞아요. 나는 LAST_INSERT_ID로 실수를했지만, 코드를 최적화하는데는 여전히 쓸모가 없다. @nnichols 현재 저속 코드를 추가했습니다 – Tin

답변

1

트랜잭션에 sql 문을 래핑 할 수 있습니다. dev.mysql.com/doc 을 참조하십시오. 그러면 데이터베이스 작성 속도가 빨라지면서 작은 단일 삽입 문을 계속 발행 할 수 있습니다.

트랜잭션을 시작하면 커밋 할 때까지 모든 디스크 액세스가 일시 중단됩니다. 즉, 모든 삽입물을 한 번에 디스크에 기록합니다. 또한 모든 하우스 키핑 업데이트는 한 번만 작성하면됩니다.

mysql_query('START TRANSACTION'); 
<your code> 
mysql_query('COMMIT'); 

: (ROLLBACK 사용) 트랜잭션을 중단 놀라 울 정도로 속도가 느려질 수 있습니다.

관련 문제