将大量数据更新到MySQL数据库

时间:2014-02-24 08:15:53

标签: php mysql batch-updates

我正在使用提供商提供的API服务。 API用法类似于 -

https://api.thesite.com/getTable1Records?offset=0 
https://api.thesite.com/getTable2Records?offset=0 
https://api.thesite.com/getTable3Records?offset=0 

(不是真实的地址) 为每个API调用返回1000条记录的JSON。

我第一次检索了所有记录并将其保存到我的数据库服务器中。 用户搜索/处理在我的数据库服务器上运行。 这是API服务提供商推荐的方式。

每当数据发生更改时,API服务提供程序都会更新其数据库。 我无法知道他们何时改变以及他们改变了什么。他们可能会添加新记录/更新现有/删除一些。 我需要定期更新我的数据库(每周一次,每周一或每周2次就可以了)。

这是我的PHP代码,它更新了一个表

// Update Table1 
echo "STARTED@" . time() . "<br />\n"; // just for log
$offset             = 0;
$username           = "username";
$password           = "password";
$url                = "https://api.thesite.com/getTable1Records";

$c                  = curl_init();    
do{
    curl_setopt($c, CURLOPT_URL,             "$url?offset=$offset" );
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($c, CURLOPT_USERPWD,        "$username:$password");
    $json           = curl_exec($c);
    $phpobj         = json_decode($json);
    $offset         += 1000;
    update($phpobj);
    echo "1000UPDATED@" . time() . "<br />\n"; // just for log
}while( count($phpobj) > 0 );
echo "ENDED@" . time() . "<br />\n"; // just for log

function update($phpobj){    
    $host     = "localhost";
    $user     = "root";
    $pass     = "";
    $db       = "theapitest";
    $link     = mysqli_connect($host, $user, $pass, $db);    

    for( $i=0; $i<count($phpobj); $i++){
        $row     = $phpobj[$i];
        $id      = mysqli_real_escape_string($link, $row->id);
        $name    = mysqli_real_escape_string($link, $row->name);
        $query   = "INSERT INTO `tablename` VALUES('$id', '$name') 
                    ON DUPLICATE KEY UPDATE `name`='$name'";
        mysqli_query($link, $query);
    }
    mysqli_close($link);
}//end function

问题是

  1. 太慢了。有些表有百万条记录。 (有更好的方法吗?)
  2. 有些表没有主键(我不能使用INSERT INTO ... ON DUPLICATE KEY 更新)
  3. 删除记录(我不知道怎么做;我认为删除所有记录并再次添加所有记录不是最好的主意)

0 个答案:

没有答案