使用php将数百万条记录插入sql server的快速方法

时间:2016-03-25 14:32:05

标签: php sql-server

我有2,000,000行的文本文件,并希望在数据库行中插入每一行,因此,使用php文件将2,000,000条记录插入sql server。最快的方法是什么?

进行测试我正在使用此代码:

@RestController
@ConditionalOnProperty(prefix="properties",name = "enabled")
public class Controller{
  public String getSomething() {
   return "Something";
  }
}

但是,这需要很多时间。这个查询可以在几秒钟内执行吗?

谢谢,

3 个答案:

答案 0 :(得分:3)

请使用批量插入,这将显着提高性能并节省时间。

详细了解SQL中的Bulk insert query

您还可以通过删除PHP并直接访问SQL数据库来节省时间,这是最初填充数据库的常见做法。

Another link

答案 1 :(得分:2)

而不是单独运行每个查询。将查询连接在一起并立即运行它。

for ( $i=1 ; $i<=2000000 ; $i++)
{
    $sql .= "INSERT INTO BlastSequenceDim (Seq_id) VALUES ('$i');";
}

$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false ) 
{
    die( print_r( sqlsrv_errors(), true));
}

答案 2 :(得分:0)

通常瓶颈是PHP没有运行多线程。这意味着在您的情况下,一个进程按顺序读取文件并逐行插入,即使您的服务器/ PC有8个或更多核心。

我遇到了同样的问题,我必须在memcache键中插入很多值,然后用php pthread解决了这个问题。

肯定会有更多的工作,但是当它是一个重复的任务时[就像我的情况一样]那么绝对值得用pthread来实现它。

作为提示,我建议启动线程的总量不应该是>比 number_of_cpu_cores x 1.5。

只有一个问题:如何协调文本文件的读取。在这里,我会考虑将两个数字传递给每个线程:

  • 从行号X
  • 开始
  • 添加到X的偏移量,以便跳过其他线程读取的行。

你会对性能提升感到惊讶!将它与你问题的其他答案结合起来将是无与伦比的......