PHP + MySQL:高效地将大型电子表格上传到 MySQL
PHP + MySQL: Upload large spreadsheet into MySQL efficiently
我正在使用 PHPSpreadsheet 获取一些用户可以上传的电子表格,添加具有特定值的列,将文件另存为 CSV,然后使用以下查询导入 csv 文件:
LOAD DATA LOCAL INFILE '{$file}'
INTO TABLE {$table}
FIELDS TERMINATED by ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
或者我可以这样做:
foreach($rows as $row){
// INSERT $row INTO table
}
所有电子表格都将具有相同的 columns/data-types。
最有效的方法是什么?从 Xlsx -> CSV -> MySQL 导入似乎我正在添加额外的步骤。
MySQL 的直接 CSV 导入通常是最快的选择,但它并非没有限制。一是您需要导入文件中的全部内容或不导入任何内容,并且在完成之前您不会知道它有多远。由于某些导入可能需要数小时,甚至数天,您可能不知道它在哪里。出于性能原因,InnoDB table 上的整个插入操作以原子方式进行,但这意味着它在完全提交之前不可见。
另一个是文件必须存在于服务器上。 LOCAL
选项是 mysql
命令行工具的一个古怪功能,除非模拟,否则可能在您的数据库驱动程序中不起作用。
使用 CSV 解析器逐行插入几乎总是较慢。如果你必须做一件事,一定要准备一个 INSERT
语句一次并在循环中重复使用它,或者做一个 "multi-INSERT
" 尽可能多的行,你可以在你的最大语句大小缓冲区中.
我正在使用 PHPSpreadsheet 获取一些用户可以上传的电子表格,添加具有特定值的列,将文件另存为 CSV,然后使用以下查询导入 csv 文件:
LOAD DATA LOCAL INFILE '{$file}'
INTO TABLE {$table}
FIELDS TERMINATED by ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
或者我可以这样做:
foreach($rows as $row){
// INSERT $row INTO table
}
所有电子表格都将具有相同的 columns/data-types。
最有效的方法是什么?从 Xlsx -> CSV -> MySQL 导入似乎我正在添加额外的步骤。
MySQL 的直接 CSV 导入通常是最快的选择,但它并非没有限制。一是您需要导入文件中的全部内容或不导入任何内容,并且在完成之前您不会知道它有多远。由于某些导入可能需要数小时,甚至数天,您可能不知道它在哪里。出于性能原因,InnoDB table 上的整个插入操作以原子方式进行,但这意味着它在完全提交之前不可见。
另一个是文件必须存在于服务器上。 LOCAL
选项是 mysql
命令行工具的一个古怪功能,除非模拟,否则可能在您的数据库驱动程序中不起作用。
使用 CSV 解析器逐行插入几乎总是较慢。如果你必须做一件事,一定要准备一个 INSERT
语句一次并在循环中重复使用它,或者做一个 "multi-INSERT
" 尽可能多的行,你可以在你的最大语句大小缓冲区中.