使用php从csv快速更新大量数据mysql [关闭]

Posted

技术标签:

【中文标题】使用php从csv快速更新大量数据mysql [关闭]【英文标题】:Fast updates mass data mysql from csv with php [closed] 【发布时间】:2021-08-10 12:37:47 【问题描述】:

我正在尝试使用 php 更新我的数据库。不幸的是,这个过程太长了。我无法使用数据加载 infile,因为我的主机不允许。

我的数据库行(id、sku、stock、image_1、image_2、image_3) 我的 csv 文件(sku、库存)

我尝试仅将 csv 文件中的库存更新到我的数据库中。

<?php      
    $connect = mysqli_connect("localhost", "databsename", "PAssword", "databsename");
    $handle = fopen("new_stock.csv", "r");
    while($data = fgetcsv($handle))
    
        $sku = mysqli_real_escape_string($connect, $data[0]); 
        $stock = mysqli_real_escape_string($connect, $data[1]);   
        $query = "UPDATE Products SET stock='$stock' WHERE sku='$sku'";
        mysqli_query($connect, $query);
    
    fclose($handle);
    echo 'finish';
?> 

【问题讨论】:

(可能的)旁注:忘记*escape_string*() 并且不要使用字符串插值或连接将值获取到 SQL 查询中。这很容易出错,并且可能使(仍然)您的程序容易受到 SQL 注入攻击。使用参数化查询。见"How to include a PHP variable inside a MySQL statement" 和"How can I prevent SQL injection in PHP?"。 is far too long 表示你达到了执行时间限制还是什么? 不,我的意思是更新所有股票需要很长时间 恕我直言,我不同意因缺乏细节而关闭此问题的决定。它非常清楚地提出了提问者的问题。 【参考方案1】:

这里的技巧是将多个 UPDATE 操作放在一个 transaction 中。为什么?当您提交您的工作时,MySQL 会完成大部分的 UPDATE 和 INSERT 工作。因此,更少的事务导致更快的操作。通常 mysqli 使用“自动提交”模式,这意味着每个语句都是它自己的事务。但这里我们使用mysqli_begin_transaction() 和mysqli_commit()。

这样的事情会起作用(不是!调试)。它还使用prepared statement 和绑定变量来代替已弃用的mysqli_real_escape_string

    $transactionSize = 500;
    $handle = fopen("new_stock.csv", "r");
    $countdown = $transactionSize;
    mysqli_begin_transaction($connection);
    $updateStatement = mysqli_prepare($connection, 
                        "UPDATE Products SET stock=? WHERE sku=?");
    while($data = fgetcsv($handle)) 
        set_time_limit(30);
        mysqli_stmt_bind_param($updateStatement , "ss", $data[0], $data[1]);
        mysqli_stmt_execute($updateStatement);
        $countdown--;
        if ($countdown <= 0) 
           /* end one transaction, start another */
           mysqli_commit($connection);
           mysqli_begin_transaction($connection);
           $countdown = $transactionSize
        
    
    mysqli_commit($connection);
    fclose($handle);
    echo 'finish';
?> 

此 Code Pattern 或类似的东西对于各种多行 INSERT 和 UPDATE 都很有用。

【讨论】:

那么脚本运行了几个小时对吧? 使用像我这样的代码,它的运行速度应该比使用示例代码快 10 到 100 倍。 有趣的代码!真的很专业! 感谢您的客气话。这种事情我做过太多次了:-) 脚本耗时很长,有 350,000 条数据记录【参考方案2】:

也许使用以下代码可以做到这一点。我有同样的问题。

set_time_limit(0);
$connect = mysqli_connect("localhost", "databsename", "PAssword", "databsename");
$handle = fopen("new_stock.csv", "r");
$str = [];
$flag = true;
$counter = 0;
$str2 = "";
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) 

    if ($flag) 
        $flag = false;
        continue;
    ;
    
    $sku = mysqli_real_escape_string($connect, $data[0]); 
    $stock = mysqli_real_escape_string($connect, $data[1]);   
    $query = "UPDATE Products SET stock='$stock' WHERE sku='$sku'; ";

   
    $counter++;
    $str2 .= $query;
    if ($counter % 10000 == 0) 
        $str[] = $str2;
        $str2 = "";
    


fclose($handle);
if ($str2 != "")
    $str[] = $str2;
    

foreach ($str as $item) 
    $item2 = str_replace('\"', '"', $item2);
    mysqli_query($connect, $item);

echo 'finish';

【讨论】:

那么脚本运行了几个小时对吧? 没有。为什么要几个小时?它将在其工作结束时完成。我猜它会很快。 这是正确的吗? $handle = fopen("new_stock.csv", "r"); $file = fopen($handle); 你说得对。对不起。我编辑了我的答案。 而且 $connect 必须在顶部?

以上是关于使用php从csv快速更新大量数据mysql [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Mysql大量数据快速排序方案

mysql大量数据更新的优化方案

最佳实践:使用 PHP 5.x 将 CSV 导入 MYSQL 数据库

从 mysql 数据库查询中使用 php 时加快 csv 导出

PHP导出大量数据到csv表

1200万 mysql数据怎么快速导入到Mongodb