【发布时间】:2014-01-25 07:36:03
【问题描述】:
我正在使用 mysql_fetch_object 检索 10K 记录(有 10 个数据类型为 datetime、text、int、varchar 的列)并从查询中的每个连接表中获取所有列,这给出了内存大小耗尽致命错误,但后来我修改了查询以仅获取一些消除错误的特定列,使我免于淹没在错误的湖中。
查询只是将 3 个表 A、B、C 连接为 SELECT * FROM A JOIN B ON ......JOIN C ON ...... WHERE.....
但我仍然担心如果没有。记录或没有。列增加,然后错误会再次出现....那么完整的解决方案是什么?我在 SO 上阅读了其他帖子,发现应该使用 mysql_unbuffered_query。但是如果我使用mysql_fetch_object,就没有解决方案吗?无缓冲查询是否会因为一次返回一行而花费更多时间?
【问题讨论】:
-
你能给我们实际代码吗?如果你想优化它,我们需要一些东西来优化。顺便说一句,这在 codereview.stackexchange.com 上可能会更好。
-
显示实际查询。您很可能会生成笛卡尔连接,因此您的 10k 条记录会膨胀成数十亿或数万亿行。
-
不,我在 mysql 中执行了查询,它实际上返回了 10000 行
-
您的表中是否有任何 LONGBLOB 或 LONGTEXT 列? PHP 将尝试预先分配足够的内存来保存这些列中可能的最大字符串,而不是实际数据的长度。这意味着它可能会尝试分配 4GB 缓冲区,远远超过 PHP 的默认内存限制。解决方案:改用 MEDIUMBLOB/MEDIUMTEXT。
-
@BillKarwin:我正在使用 TEXT 数据类型,用户可以为该字段输入任何长度的输入,因此我无法限制该字段的大小
标签: php mysql memory-management