php – 从巨大阵列插入批量MySql:优化问题

在资源优化方面,我被要求选择哪个是三个中最好的选项.假设我有一个包含数千个记录的大型Excel文件,我需要提取这些数据并将它们插入到数据库中.
3个选项是:

>将所有内容加载到多维数组中,只需一个复杂查询即可插入所有内容;
>将所有内容加载到多维数组中,然后遍历每个excel行并执行简单的插入查询.
>在循环内部,读取每个Excel行,将其放入数组中,然后在数据库上执行简单的插入查询.

这是面试(我把它标记为家庭作业,不确定它是否正确);我思索了一会儿:

>案例1:我可能会冒* out_of_memory *错误(当然取决于机器),但它是对数据库执行较少请求的解决方案.两个缺点是要分配给阵列和数据库的大量内存.我知道我可以将excel转换为CSV,但这不是一个选项.我会选择一个大阵列和一个批量插入,但我担心这对数据库来说很难.
>案例2:将数据加载到数组时可能会出现* out_of_memory *错误,但第二项任务不会出错.尽管如此,执行数千次查询可能会对数据库造成性能损失,并且此查询可能是优化的候选者.
>案例3:仍有一个循环超过数千条记录(这也需要大量内存……),并且仍然有数千条查询要运行(它会访问数据库).

所以,我实际上选择了答案一,在做之前我想了一些.

这是错的.我实际上并不知道三者中哪一个是正确的.

有人可以帮我吗?这个答案真的很糟糕吗?我认为成千上万的插入查询会“糟糕”,但似乎我完全错了..

编辑
澄清:我的问题不是关于哪个是绝对最好的优化,而是我提出的三个中的哪一个;所以我不是在考虑其他的选择,只是解释为什么我错了,而且论证的是最好的答案.

解决方法:

一方面,这似乎是一个棘手的问题.理智的答案是,使用批量导入实用程序,如MySQL的mysqlimport或SQL Server的BULK INSERT … FROM [data_file].另一方面,这些实用程序基本上是执行上述三个选项之一(尽管可能是高度优化的方式).

事实是,在回答这些问题时你必须考虑整个问题. “资源利用率方面的最佳选择”是案例3,因为您的内存使用率相当低,并且大多数数据库平台都设计为处理每秒请求数量的指标.

上一篇:Linux 内核usb_bulk_msg 接口


下一篇:Python – 批量选择然后从一个DB插入到另一个DB