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

Kir*_*gan 8 php mysql memory arrays pdo

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

  • VARCHAR(6)从单个表中拉出一个列
  • 结果是不到30K行
  • 此获取该结果使用在〜PHP的存储器12MB(来源:memory_get_usage)
  • 如果我json_encode将结果转储到文件中,实际数据(文本形式)只有~1MB
  • 使用PHP7,MySQL 5.7,部署在Ubuntu 14.04上.

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

编辑:

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

Kir*_*gan 3

好的,感谢奥利·琼斯的回答,我意识到我一直在错误的地方寻找信息。这不是 PDO 内存使用问题,而是 PHP 存储数组的方式问题。(也许“问题”这个词不恰当,它就是这样)

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

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

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

根据该文章,内存被分配用于以下目的:

  • zvalue_valueunion,与 PHP 允许的弱类型转换有关
  • 类型存储和垃圾收集数据
  • Zend 内存管理器分配
  • 哈希表桶

如果您也对此感兴趣,我强烈建议您阅读该文章,它读起来很快,并且包含很多有用的信息。

再次感谢奥利·琼斯为我指明了正确的方向。