2012-12-16 121 views
-2

我有一个csv文件,包含65000条记录,需要导入到我的数据库中。php将csv导入数据库

我试过下面的代码,但真的很慢。

无论如何,我可以做得更快。

@set_time_limit(1200); 
    $file = './csvFiles/aw_Products.csv'; 
    $handle = fopen($file , 'r'); 
    while (($row = fgetcsv($handle)) !== false) {  
     if(is_integer($row[0]) || $row[0] != 0) 
     { 
      $product = new Product(); 
      $product->merchant_id  = $row[0]; 
      $product->merc_product_id = $row[1]; 
      $product->product_id  = $row[2]; 
      $product->product_name  = $row[3]; 
      $product->product_desc  = htmlentities($row[4]); 
      //$product->keywords   = htmlentities($row[6]); 
      $product->category_id  = $row[5]; 
      $product->link_url   = $row[6]; 
      $product->image_url   = $row[7]; 
      $product->price    = $row[8]; 
      $product->delivery_cost  = $row[9]; 
      //$product->deliveryAvailable = $row[12]; 
      //$product->deliveryDetails = $row[13]; 
      //$product->valid_to   = $row[14]; 
      //$product->valid_from  = ($row[3] == 'yes') ? 1 : 0; 

      if(Product::find_by_id($row[0])) 
       $product->updateRecord(); 
      else 
       $product->createRecord(); 
     } 
     sleep (1); 
    } 
    fclose($handle); 
+1

也许这是更合适的:http://stackoverflow.com/questions/9057377/import-csv-or-xml-to-mysql –

+4

什么是'睡眠(1);'为?你叫它65000次,所以当然可能需要一段时间。 –

+0

尝试放置此代码 - > $ product = new Product()循环外。 – Yagi

回答

2

sleep()可能是罪魁祸首。但我也想知道这个:Product::find_by_id(),因为它可能会为每个INSERT执行SELECT查询。您可能会考虑制作一个SELECT查询以将所有现有数据库密钥都获取到PHP数组中,然后可以使用* in_array()*来检查是更新还是插入。大概不言而喻,但是如果你插入了,你会想添加到PHP数组中。

1

放弃睡眠()并使用mysql语句插入/更新预处理语句。