高效插入复杂数据mysql

时间:2012-04-12 17:07:29

标签: php mysql

我尝试将一些复杂的数据插入到mysql数据库中,但是我对实现的性能有疑问。我的数据如下:

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

为此,我在我的数据库中定义了3个表

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

我收到了一大堆要插入数据库的数据。因为这些表是链接的,所以我现在有一个插入用户的实现,检索ID并在VALUES中使用它来解决问题...它可以工作但我收到'超过30秒的最大执行时间'因为分开的数量mysql插入语句。

我目前的代码如下:

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);
  }
}    

如果在下一个插入语句中使用前一个插入的ID,我如何将单独的insert语句组合成一个大的语句?我尝试使用LAST_INSERT_ID(),但这不能按预期工作。它似乎引用了该表的最后一个ID。

或者可能有另一种解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以将sql语句包装在事务中。见dev.mysql.com/doc 这可能会加速数据库的填充,同时仍允许您继续发出小的单个插入语句。

启动事务时,所有磁盘访问都将暂停,直到您提交为止。这意味着所有插入都将一次写入磁盘。此外,所有管家更新只需要写一次。

e.g。

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

注意:中止交易(使用ROLLBACK)可能会非常慢。