【发布时间】: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() 将整个文件读入内存(确保使用正确的标志),然后使用
foreach和str_getcsv() 来提取您的数据。这应该比逐行阅读要快,但总体上可能没有太大区别。 -
CSV 中有多少行?数据库中有多少行?哪些列被索引?
-
哪个超时具体?
-
这些列上没有索引。我可能会尝试你的建议。似乎很奇怪,它无法处理它。大约 700 行更新。