Понимание использования памяти MySQL приводит к PHP (PDO)

Я пытаюсь понять, почему использование памяти для одного результата PDO настолько велико. Вот несколько вещей, которые нужно знать о запросе / результате:

  • Я вытаскиваю один столбец VARCHAR(6) из одной таблицы
  • Результат составляет менее 30 тыс. Строк
  • При получении этого результата в PHP используется ~ 12 МБ памяти (source: memory_get_usage )
  • Если я json_encode результат и дамп его в файл, фактические данные (в текстовой форме) только ~ 1 МБ
  • Использование PHP7, MySQL 5.7, развернуто на Ubuntu 14.04.

Мой вопрос в том, где именно появляется 11MB раздува? Если фактические данные в текстовой форме составляют всего около 1 МБ, то 11 МБ, похоже, много накладных расходов, чтобы просто анализировать данные на PHP. Для этого есть причина? Я что-то упускаю?

Редактировать:

Чтобы уточнить, я ищу техническое объяснение того, почему существует раздувание, а не обходной путь для этой проблемы.

Хорошо, поэтому благодаря ответу Олли Джонса я понял, что искал не то место для своей информации. Это не проблема использования памяти 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 , которое относится к слабому zvalue_value , которое позволяет PHP
  • Данные для хранения и сбора мусора
  • Распределение менеджера памяти Zend
  • Ведра для хэширования

Если у вас есть интерес к этому, я настоятельно рекомендую прочитать эту статью, ее быстро прочитать и получить много отличной информации.

Еще раз спасибо Олли Джонсу за то, что он указал мне в правильном направлении.

Трудно дать конкретный ответ, не видя своего конкретного кода. При этом структуры данных PHP, такие как массивы, являются ассоциативными. Разработчики PHP намеренно сделали компромисс для использования дополнительной памяти для экономии времени на доступе к массиву.

Вы можете сэкономить память несколькими способами. Во-первых, вы можете получить каждую строку вашего набора результатов как числовое, а не ассоциативный массив. Прочитай это. http://php.net/manual/en/mysqli-result.fetch-array.php

С другой стороны, PHP вырывает все строки в вашем результирующем наборе сразу, пока вы не скажете об этом. Эта операция slurp потребляет много оперативной памяти. Вам это не нужно, если вы планируете обрабатывать свой большой результат, задавая по одной строке за раз. Для этого вам нужен небуферизованный запрос . Читайте это: http://php.net/manual/en/mysqlinfo.concepts.buffering.php