从巨大的数组插入批量MySql:优化问题

时间:2011-07-11 20:39:54

标签: php mysql performance bulk

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

  1. 将所有内容加载到多维数组中,只需一个复杂查询即可插入所有内容;
  2. 将所有内容加载到多维数组中,然后遍历每个excel行并执行简单的插入查询。
  3. 在循环内部,读取每个Excel行,将其放入数组中,然后在数据库上执行简单的插入查询。
  4. 这是面试(我把它标记为家庭作业,不确定它是否正确);我思索了一会儿:

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

“错误”似乎是错误的答案。

有许多权衡,“正确”答案取决于您未列出的因素,例如:1)这是一个生产数据库吗? 2)插入此数据时网站是否在线? 3)如果插入行1并且公众可见,那么行10,985不是吗? 4)当你在场时,其他人是否会写信给你?

假设所有这些问题的答案都是肯定的,我可能会一次读取并插入行。前两个将锁定您的表,以便其他任何人都无法访问它。使用选项3,您甚至可以计算插入率。

答案 2 :(得分:0)

我认为PHP方式预先假定案例3,因为您最大限度地减少了使用的内存量。它很慢,但它减少了每个操作占用内存的方式。将整个事物加载到一个大的多维数组中并执行复杂的插入需要更多的资源,并且加速并没有那么好。问题在于,这是一项长期运行的任务,所以也许这就是让你失望的原因。

无论谁写这篇文章似乎都没有考虑过插入操作对于数据加载来说是昂贵的,并且当你需要加载大量数据时不应该使用它。