如何执行多个mysqli_multi_queries?

时间:2015-08-03 16:06:12

标签: php mysql mysqli hybrid

我试图读取一个大的XML文件并插入数据库中的所有数据。我正在尝试3种不同的场景(我需要帮助第三种):

  1. 在每个XML元素之后,我执行一个查询:$this->mysqli->query($sql);
  2. 我将所有INSERT添加到$sql变量中,在循环之后,我使用一个多查询$this->mysqli->multi_query($sql);一次性插入所有内容。
  3. 我进行了测试,两种情况都不符合我的喜好:

    1. 在数据库中插入所有数据,但运行时间为113秒。这不是一个大问题,但我想做得更好!
    2. 这是我用于较小的XML文件的选项,它可以创造奇迹。对于我的一个功能,它将执行时间从6.5秒减少到0.17秒,同样准确。这个文件的问题是:这个$ sql包变得太大而且脚本变得不稳定,输出错误。
    3. 所以现在我想出了第三种混合解决方案。但它没有按预期工作。它背后的想法是在每200个元素之后创建一个$this->mysqli->muli_query($sql);调用,然后重新启动该过程。我想我错过了对mysqli-> multi_query函数的正确理解,因为对我来说下面的代码非常有意义。但也许我需要释放/指向/下一个()某些东西?

      无论如何:在运行脚本之后,数据库没有完全填满。

      如上所述,在我的代码下面:

      if ($xmlObj) {
              $sql = "";
              $i = 1;
              foreach ($xmlObj->Response->FeaturesList->Feature as $feature) {
                  $sid = $feature["ID"];
                  $sql .= "INSERT INTO ...;";
                  // Hybrid solution
                  if (($i % 200) == 0) {
                      $this->mysqli->multi_query($sql);
                      $sql = "";
                  }
                  $i++;
              }
              // Hybrid: Update the leftovers
              $this->mysqli->multi_query($sql);
          }
      

      更新 Mihai添加的选项#4工作正常。我创建了一个INSERT..VALUES(a),(b),(c)字符串,并使用mysqli->query()添加了10秒运行并添加了所有元素。感谢

      关于multi_query之谜的问题仍然存在!

0 个答案:

没有答案