为了账号安全,请及时绑定邮箱和手机立即绑定

如何提高php中csv数据插入数据库的速度?

如何提高php中csv数据插入数据库的速度?

PHP
qq_花开花谢_0 2023-08-19 17:55:01
我编写了这段代码,允许读取文件夹,根据文件名插入到不同的表中的 csv 文件的数据。文件处理完毕后,将被移动到另一个文件夹。我的代码运行良好,但第二个 csv 文件长度超过 80 000 行,需要几个小时才能集成到我的数据库中。如何提高代码的性能?我尝试“加载本地数据”但没有成功......<?phpinclude("../connexion.php");ini_set('max_execution_time', 54000);$timestamp= date("y-m-d H:i");$dir   = 'D:/xampp/htdocs/retail_BI/test/';$allFiles = scandir($dir);$dest = 'D:/xampp/htdocs/retail_BI/test/files/';   foreach($allFiles as $file) {        if (!in_array($file,array(".","..")))      {           $file = $dir.$file;        $filename = basename( $file );               if ( strpos( $filename, 'BI1_' ) === 0 ) {        if (($handle = fopen("$filename", "r")) !== false) {                        //To remove BOM in the fist cell              fseek($handle, 3);                        while (($data = fgetcsv($handle, 9000000, ";")) !== false) {                if (empty(array_filter($data))) {                    echo "not good";                continue;                }             $date = DateTime::createFromFormat('d/m/Y H:i:s A', $data[2]);            if ($date === false) {            break;            }            $date1 = $date->format('Y-m-d'); // 2020-07-07            $date2 = $date->format('Hi A'); // 1247 AM                          //database entry                             $query = "insert into dbo.Y2_Sales (storenumber, storename, date, time, TransRef, stylecode, color, size, quantity, unit_price, SalesExGST, cost, currency)                values('$data[0]', '$data[1]','$date1','$date2','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]', '$data[8]','$data[9]','$data[10]','$data[11]')";                   $stmt = $conn->query( $query );                     if (!$stmt) { echo $conn->error;}                                                          }                   }                
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

不要将每一行的数据插入数据库,而是尝试批量插入。

您始终可以进行批量插入,可以获取 n(使用 1000)个条目并将其插入到表中。

这将减少数据库调用,从而减少总时间。

对于 80k 条目,您也有可能超出内存限制。

您可以使用 php 中的生成器来克服这个问题。 

虽然这是在 Laravel 中,但是从 csv 读取的代码是独立的(使用生成器的代码),并且可以在此处使用逻辑。


查看完整回答
反对 回复 2023-08-19
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信