推荐:方案 A — CSV 游标流式导出
核心思路:不一次性加载,MySQL 游标分批取 → 写一行 → flush → 释放 → 下一批。
while (true) { SELECT ... WHERE id > $lastId LIMIT 5000; ← 只取 5000 行 │ foreach → fputcsv($fp) ← 逐行写文件指针 │ ob_flush() / flush() ← 推到浏览器 │ $lastId = 最大 id; unset($batch); ← 释放内存 }内存:仅当前批次 5000 行 ≈ 15-30MB,与总行数无关。
耗时:MySQL 扫描 + PHP 写 CSV,359 万行预计 3-8 分钟。瓶颈在customer_user LEFT JOIN customer(取决于两表id是否主键/索引,主键 JOIN 很快)。
浏览器体验:CSV 流式输出,浏览器会持续接收数据直到完成,不会超时(只要set_time_limit(0)+ 持续 flush)。