【问题标题】:Why does this CSV/MySQL import script timeout?为什么这个 CSV/MySQL 导入脚本会超时?
【发布时间】:2021-06-03 21:57:13
【问题描述】:

我正在尝试将 CSV 导入 MySQL 表并在相关行上执行更新。但是,下面的脚本运行非常缓慢,并且在生产服务器上遇到了超时。我可以让它在我的本地主机上工作,但是当我尝试部署时运行非常缓慢。任何帮助将不胜感激。

if ( is_uploaded_file( $_FILES[ 'file' ][ 'tmp_name' ] ) ) {

    $csvFile = $_FILES[ 'file' ][ 'tmp_name' ];
    $query = "update tblworkoutdata3 
                set peakForce = ?, 
                    averageForce = ?, 
                    driveLength = ?, 
                    driveTime = ?, 
                    percentagePeak = ?, 
                    impulse = ?, 
                    work = ?, 
                    strokeSpeed = ?, 
                    forceCurvePoints = ? 
                where workoutid = ? 
                and personid = ? 
                and strokenumber = ?";

    $statement = $dbhandle->prepare( $query );

    if ( ( $handle = fopen( $csvFile, "r" ) ) !== FALSE ) {
        while ( ( $data = fgetcsv( $handle ) ) !== FALSE ) {
            $parameters = array( $data[8], $data[9], $data[10], 
                                $data[11], $data[12], $data[13], 
                                $data[14], $data[15], $data[16],
                                $workoutplanid, $athleteid, $data[0] );
            $statement->execute( $parameters );
        }
        fclose( $handle );
    }
}

【问题讨论】:

  • WHERE 子句中的列是否有索引?
  • 您可以尝试使用file() 将整个文件读入内存(确保使用正确的标志),然后使用foreachstr_getcsv() 来提取您的数据。这应该比逐行阅读要快,但总体上可能没有太大区别。
  • CSV 中有多少行?数据库中有多少行?哪些列被索引?
  • 哪个超时具体
  • 这些列上没有索引。我可能会尝试你的建议。似乎很奇怪,它无法处理它。大约 700 行更新。

标签: php mysql csv


【解决方案1】:
  1. 使用LOAD DATA 获取数据。这一步可能快 10-100 倍。
  2. 将数据放入临时表中。
  3. UPDATE(或 IODKU)临时表中的真实表。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 2021-12-03
    • 2010-09-20
    • 2010-12-09
    • 2010-09-16
    • 2016-10-20
    • 2018-05-20
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多