多维PHP数组或对mysql DB的多个查询

时间:2009-04-15 11:53:25

标签: php mysql multidimensional-array

我正在使用PHPExcel lib,它似乎做得很好,但在我的方法中它看起来并不那么快。

我需要生成一个包含大量工作表,数据,公式和样式(粗体,颜色,边框)的excel文件,这需要我分配计算资源和时间。
我认为我的方法不太好。当使用来自mysql DB的PHP代码和数据生成这种文件(excel)时,必须是正确的顺序。

1)生成所有没有格式/样式,没有公式,添加数据以及公式和样式的工作表 2)逐页生成数据,添加公式,添加样式
3)....

最好是在多维数组中获取数据库中的所有数据,而不是每次要写入新工作表时都要查询数据库?

我正在使用双核处理器机器和4GB或RAM,如果Apache没有粉碎,我需要大约1分钟。

6 个答案:

答案 0 :(得分:2)

我建议您分析您的PHP代码,以找出花费最多时间的地方。您可以在我的博客上找到a step-by-step tutorial about using XDebug to profile PHP conde。然后尝试优化消耗最多时间/被最频繁调用的部分。您可以做的最好的优化之一是尽可能用内置函数替换PHP方法,因为它们的速度要快几个数量级。

答案 1 :(得分:2)

  1. 让mysql做计算:我曾经优化了一个报表,其中原始开发人员使用循环来计算总和而不是sql sum函数,它编写得非常糟糕,超出了php的时间限制
  2. 确保您的计算SQL已经足够优化
  3. 计算然后生成内容

答案 2 :(得分:2)

执行更多,更简单的查询比执行更少,更复杂的查询更快。但是你需要对它们进行基准测试,因为它很大程度上取决于你要查询的数据。

也就是说,您可能遇到了PHP中的内存问题。我建议您看看是否可以重新安排数据处理算法。我将要努力的是一次只获得一个大型数据集,但已经按照您需要处理它的顺序按MySQL排序。然后,您可以使用无缓冲的查询。

无缓冲查询意味着客户端库在将其交给代码之前不会存储整个结果集。这意味着它可能比通常处理的库大,但为了使其工作,您的处理循环必须在每个循环中从API获取一行 - 即这意味着调用while()的{​​{1}}循环每一次。

完成已经按照您需要的顺序排列的结果集的另一个好处是,您可以要求的不仅仅是您需要的东西,并且可以随时过滤掉它。这在需要更多信息时有效,因为数据库 less 过滤。

答案 3 :(得分:1)

数据库查询,即使返回30,000行的数据库查询,通常只需要几分之一秒。有了这样的proc和RAM,它可能在IO上放慢速度。我愿意打赌,大部分时间都花在写文件上。

话虽如此,我建议事先提供所有数据。至少那时,你是从记忆中读书的。我不确定MySQL是否使用指向当前行的指针将所有内容加载到内存中,或者它是否只加载当前行。

答案 4 :(得分:1)

使用一分钟的处理时间,您的数据集听起来不够大,无法对结果集进行分区。

因此假设将所有内容加载到内存中就可以了。

但是,无论如何,mysql都会缓存查询,因此连续的重复查询也不应该是一个大问题。

听起来像IO写入磁盘上的文件是你的慢点。我不太清楚xls文件的样式和格式化是如何工作的,但我很确定你可以通过减少格式化或组织它来减少大量无意义的写入,这样你就不会进行任何内联格式化,如果那样的话可能的。

我建议的最好的方法是优化您的查询。这通常是我在这类问题上看到的第一个优化位置。如果你可以编辑你的帖子并包含sql我可以看看。 (随意剪切和删除敏感信息)

答案 5 :(得分:0)

MySQL将能够执行除PHP层之外的任何数据计算/转换,因此我会编写一个查询来完成所有工作以获取一个电子表格的数据。

对每个电子表格执行一次。