PHP / MySQL在2个表中插入大数据

时间:2018-01-04 15:52:20

标签: php mysql

我正在尝试从以json格式保存的大型数组中将数据导入我的MySQL数据库。我用JavaScript编写了一个小脚本,通过该数组并通过AJAX调用发送所有相关数据。我的php文件获取1条记录的数据,检查所有字段是否有效,然后继续将其插入到我的主表中。数据还可能包含链接到主条目的信息。也许0,也许是多行,无论哪种情况,所有这些都经过验证并插入到另一个表中,引用主条目的id。

我将尝试提出一个简单的例子来更好地说明我正在尝试做的事情:

要插入的数据:

source : { id: 0, f1: 50, f2: 100, f3: 310, 
    linked : [ l1: { d: "B", v: 32.50}, l2: { d: "C", v: 27.30} ]
}

以下是我的php文件在简化版中的作用:

if(valid($source)){ // validate passed data and proceed if they are valid
    //check passed id (id == 0 => insert,  id > 0 => update)
    if($source['id'] == 0){
        //INSERT new row into main_table
        $last_id = $pdo->lastInsertId(); //get new id

        //if there is additional data, insert each row into link_table
        if(!empty($source['linked']){
            foreach($source['linked'] ...){
                //validate linked data
                //INSERT INTO link_table (main_id, ...) VALUES(:source_id, ...);
            }
        }
    } else if($source['id'] > 0){
        //attempt UPDATING existing row in main_table where id = source.id
        $last_id = $source['id'];

        //...UPDATE linked data in link_table (where main_id = $last_id)
    }
}

这样在处理单个记录时工作正常。 (注意:我现在只想插入新行,所以UPDATE部分在这里不相关。)我不知道插入数千行的最佳方法是什么,所以没有更好的选择,我的脚本会为每条记录发送一个AJAX调用。我知道这在很多方面都是可怕的,但它确实有效。毋庸置疑,我的本地网络服务器以这种方式变得非常繁忙,插入4000多行需要30多分钟。我是通过AJAX来做的,因为我不知道如何插入我的json数据 - 这需要一些修改开始...... - 使用更好的方法。我打赌使用正确的查询不会超过几秒钟,但我如何构建一个查询,将所有内容插入到我的main_table中,并将所有链接的行插入到link_table中,基于main_table id?

1 个答案:

答案 0 :(得分:0)

你可以做几件事:

  1. 首先,完全删除JS和浏览器,只从SSH窗口运行PHP脚本。这将在不对PHP进行任何更改的情况下更快地运行。
  2. 如果这还不够,您可以通过多次插入获得一定的速度,例如:https://www.w3schools.com/php/php_mysql_insert_multiple.asp
  3. 对于第2点,请注意一次可以运行的数量有限制...我不记得它现在是什么,它可能依赖于服务器配置...尝试使用100到从那里开始,然后从那里开始。