我的问题实际上围绕着重复使用大量数据。
我有大约50mb的数据需要在单个php页面执行期间重复交叉引用。通过使用带有表连接的SQL查询,可以轻松解决此任务。问题是我需要在很短的时间内处理大量数据以及执行此操作所需的查询数量。
我目前正在做的是将每个表的相关部分(通常超过30%或10k行)转储到数组中并循环。表连接总是在一个字段上,所以我构建了一个非常基本的“索引”来识别哪些行是相关的。
系统有效。它已经在我的生产环境中存在了一年多,但现在我正试图从中榨取更多的性能。在我正在分析的一个特定页面上,第二个最高总时间归因于循环通过这些数组的增量行。它的命中数为130万,总执行时间为30秒。这表示由大约8200个sql查询执行的工作,它可以实现相同的结果。
我正在寻找的是其他任何有这种情况的人。我真的不能相信我是第一个拥有大量需要用PHP处理的数据的人。
谢谢!
非常感谢在此提供一些建议的所有人。看起来这里并没有像我希望的那样真正的小条子弹。我想我最终要做的是使用混合的mysql内存表和某个版本的分页内存缓存。
答案 0 :(得分:1)
好吧,我正在研究类似的情况,我需要处理大量数据,并选择尝试通过MySQL查询执行尽可能多的操作,或者将其卸载到PHP。
到目前为止,我的经验是:
PHP比使用MySQL查询慢得多。
如果我将逻辑塞进一个呼叫中,MySQL查询速度是可以接受的,因为呼叫之间的延迟非常严重。
我特别震惊的是,PHP在循环过多的数据时速度有多慢。我一直在想/希望我做错了什么......
答案 1 :(得分:1)
这个解决方案很大程度上取决于你在使用数据做什么,但我发现当你试图在一个列上给定一定值的行时,在数组键中使用唯一值列会加速很多事情。 这是因为php使用哈希表存储密钥以进行快速查找。它比迭代数组或使用array_search快数百倍。 但是没有看到代码示例很难说。
从评论中添加:
下一步是使用一些内存数据库。您可以使用memory tables in mysql或SQLite。还取决于您控制的运行环境的多少,因为这些方法需要的内存比共享托管服务提供商通常允许的内存多。由于分组,排序,聚合函数等,它可能还会简化您的代码。