了解MySQL的内存使用情况导致PHP(PDO)

时间:2016-07-24 13:53:16

标签: php mysql arrays memory pdo

我试图理解为什么单个PDO结果的内存使用率如此之高。以下是有关查询/结果的一些信息:

  • 我从单个表中提取单个VARCHAR(6)
  • 结果小于30K行
  • 获取此结果在PHP中使用~12MB内存(来源:memory_get_usage
  • 如果我json_encode结果并将其转储到文件中,实际数据(文本形式)只有~1MB
  • 使用部署在Ubuntu 14.04上的PHP7,MySQL 5.7。

我的问题是,11MB的膨胀到底在哪里?如果文本形式的实际数据只有大约1MB,那么11MB似乎只是为了解析PHP中的数据而花费很多。是否有一个原因?我错过了什么吗?

编辑:

为了澄清,我正在寻找技术解释为什么存在膨胀,而不是问题的解决方法。

2 个答案:

答案 0 :(得分:3)

好的,感谢Ollie Jones的回答,我意识到我一直在寻找错误的地方来获取我的信息。这不是PDO内存使用问题,但是PHP存储其数组的方式存在问题。 (也许问题不是正确的词,它就是它)

经过一番挖掘后,我发现了这篇非常有用的文章,它详细介绍了PHP如何为数组元素分配内存:

https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html

Spoiler alert,它为每个元素使用TON内存。显然它在PHP7中已经变得更好了。文章指出,对于一个简单的整数数组(在PHP5中),它将使用大约18倍于整数本身大小的内存。由于我看到关联字符串数据增加了12 *,因此id表示这确实是对PHP5的巨大改进。

根据该文章,正在为以下内容分配内存:

  • zvalue_value union,与PHP允许的弱类型转换相关
  • 输入存储和垃圾回收数据
  • Zend Memory Manager分配
  • 哈希表桶

如果您对此也有兴趣,我强烈建议您阅读该文章,快速阅读并提供大量有用信息。

再次感谢Ollie Jones指出我正确的方向。

答案 1 :(得分:2)

如果没有看到具体的代码,很难给出具体的答案。话虽如此,像数组这样的PHP数据结构是关联的。 PHP设计人员故意做出权衡,使用额外的RAM来节省阵列访问时间。

您可以通过多种方式节省内存。首先,您可以将结果集的每一行作为数字而不是关联数组获取。读这个。 http://php.net/manual/en/mysqli-result.fetch-array.php

另一方面,PHP会立即篡改结果集中的所有行,除非你告诉它不要。这种slurp操作消耗了大量的RAM。如果您计划一次处理一行大型结果集,则不需要这样做。您需要无缓冲查询才能执行此操作。阅读:http://php.net/manual/en/mysqlinfo.concepts.buffering.php