PHP面试题更新 2026-08-05

在内存限制为 100M 的环境下,采用 PHP 语言将大小为 1G 的 CSV 文件导入数据库,请阐述具体的实现思路与步骤。

编码实现性能优化问题拆解PHP

考察说明

考察在内存受限条件下处理大数据文件的方案设计与工程实践能力。

回答思路

  1. 【回答框架 1】采用流式读取,逐行或分批读取 CSV 文件,避免一次性将整个文件载入内存。使用 PHP 的 fopen 和 fgetcsv 函数逐行解析,每行处理完毕后释放变量,确保内存占用保持低位。
  2. 【回答框架 2】利用数据库批量插入机制提升效率,例如每读取 1000 至 5000 行执行一次 INSERT,采用预处理语句(PDO prepare)减少重复解析开销,同时减少网络往返次数。
  3. 【回答框架 3】事务处理:将大批量插入包裹在事务中,可以显著提升写入速度,但需注意事务大小,避免因单次事务过大导致数据库锁与回滚日志膨胀,建议根据实际测试调整批量提交的行数。
  4. 【回答框架 4】考虑使用 LOAD DATA INFILE 等数据库原生导入工具,但需注意文件格式与字段映射,若允许,可先进行文件格式预处理或字段校验。
  5. 【回答框架 5】对数据库性能优化:在导入前暂时禁用或延迟更新索引、触发器等,导入完成后重建,以加速写入。
  6. 【关键点 1】使用 fopen 和 fgetcsv 逐行读取 CSV,避免 file_get_contents 或 file 函数导致内存溢出。
  7. 【关键点 2】采用批量插入和事务控制,每批 1000-5000 行,使用预处理语句提升效率。
  8. 【关键点 3】如需更高速率,可评估 LOAD DATA INFILE 的适用性,并注意其限制。
  9. 【关键点 4】导入前临时禁用非必要索引与触发器,导入后重建。
  10. 【关键点 5】监控内存使用,unset 处理过的数据变量。
  11. 【易错点 1】使用 file 函数或 file_get_contents 加载整个文件会导致内存溢出。
  12. 【易错点 2】逐行插入会导致大量 SQL 语句执行,性能极低。
  13. 【易错点 3】开启事务后未及时提交或批次过大,可能导致数据库锁等待或超时。