基于PHP+MySQL从多层JSON文件建表并导入百万条数据的问题咨询
JSON文件批量修复方法
如果你的单条记录闭合的}都是单独占一行,直接用sed命令批量处理:
sed 's/^}$/},/' 原文件.json > 修复后文件.json
处理完成后手动删掉最后一条记录末尾多余的逗号即可,100万条记录处理时间不超过1分钟。如果是Windows系统,安装Git Bash后运行同样命令即可。
问题解答
1. 最优数据库搭建方案
推荐使用MySQL 8.0+版本,采用混合存储结构平衡性能和开发效率:
- 主表存储所有一级常用字段:把经常用于查询、过滤的字段(如id、full_name、gender、job_title、location_region等)单独设为表列,对应设置合适的字段类型,主键设置为自带的id字段,常用查询字段加索引,100万条数据查询性能完全达标。
- 不常用的非查询类字段可以直接合并存为JSON列,减少表字段数量,降低维护成本。
如果你后续没有复杂的关联查询需求,也可以直接选择MongoDB这类文档型数据库,直接导入JSON数据,不用做结构化转换,开发效率更高,但结合你已经选定PHP+MySQL的技术栈,上面的混合方案更适配。
2. 84个字段快速生成增删改查SQL
两种方案可选,都不用手动敲全量字段:
- 用ORM工具:PHP生态里的Laravel Eloquent、ThinkPHP ORM都支持自动映射表字段,定义好模型类后直接调用
create()、update()、find()、delete()方法即可完成CURD操作,完全不用手写SQL语句。 - 自行写脚本生成:先写一段简单的PHP代码遍历单条JSON的所有一级键名,得到字段列表数组,之后通过数组拼接自动生成CREATE TABLE、INSERT、UPDATE语句,84个字段的全量SQL10分钟内就能生成完成。
3. 嵌套数组/结构的存储方案
根据你的使用场景三选一:
- 高频查询嵌套内容:单独建关联表,比如
user_profiles、user_experience表,表中加user_id字段关联主表的id,每条嵌套数据对应关联表的一行记录,需要查询时用JOIN关联,性能最好。 - 低频查询/仅做存储:直接用MySQL的JSON类型字段存储,MySQL 8.0支持直接通过JSON_EXTRACT等函数查询JSON内部字段,不需要额外解析,灵活性高。
- 完全不需要查询嵌套内容:可以直接序列化后存TEXT列,存储空间占用更小,但不支持直接查询,适合纯归档类数据。
内容的提问来源于stack exchange,提问作者Raza Chishti
相关产品推荐
相关产品推荐

