0

我的问题确实围绕着大量数据的重复使用。

我有大约 50mb 的数据需要在单个 php 页面执行期间重复交叉引用。使用带有表连接的 sql 查询最容易解决此任务。问题是我需要在很短的时间内处理大量数据以及执行此操作所需的查询数量。

我目前正在做的是将每个表的相关部分(通常超过 30% 或 10k 行)转储到一个数组中并循环。表连接总是在一个字段上,所以我建立了一个非常基本的“索引”来识别哪些行是相关的。

该系统工作。它已经在我的生产环境中使用了一年多,但现在我正试图从中挤出更多的性能。在我正在分析的一个特定页面上,第二高的总时间归因于循环通过这些数组的增量线。它的命中数为 130 万,总执行时间为 30 秒。这代表了大约 8200 个 sql 查询将执行的工作以实现相同的结果。

我正在寻找的是其他有过这种情况的人。我真的不敢相信我是第一个拥有大量需要用 PHP 处理的数据的人。

谢谢!


非常感谢在这里提供一些建议的每个人。看起来这里并没有像我希望的那样真正的银弹。我想我最终要做的是混合使用 mysql 内存表和某些版本的分页内存缓存。

4

2 回答 2

1

好吧,我正在研究一种类似的情况,在这种情况下我有大量数据要处理,并且可以选择尝试通过 MySQL 查询来做同样多的事情,或者将其卸载到 PHP。

到目前为止,我的经验是这样的:

  1. PHP 比使用 MySQL 查询慢很多。

  2. MySQL 查询速度只有在我将逻辑塞进一个调用时才可以接受,因为调用之间的延迟很严重。

我对 PHP 循环处理少量数据的速度感到特别震惊。我一直在想/希望我做错了什么......

于 2012-12-07T18:29:15.590 回答
1

这个解决方案很大程度上取决于你对数据做了什么,但我发现当你试图在列上查找给定值的行时,在数组键中工作的唯一值列会大大加快速度。这是因为 php 使用哈希表来存储快速查找的键。它比遍历数组或使用 array_search 快数百倍。但是没有看到代码示例很难说。

从评论中添加:

下一步是使用一些内存数据库。您可以在 mysql或SQLite中使用内存表。还取决于您控制多少运行环境,因为这些方法需要的内存比共享主机提供商通常允许的要多。由于分组、排序、聚合函数等,它可能还会简化您的代码。

于 2012-12-07T18:46:42.233 回答