PHP: как результаты запроса хранятся в mysqli_result

Когда я делал запрос к базе данных и извлекал результаты в mysqli_result, использование памяти крайне мало. Однако, когда я получаю все строки в результатах запроса в ассоциативный массив, использование памяти становится чрезвычайно высоким.

<?php require_once("../config.php"); //db connection config $db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE); $query ="select * from table_name"; if($r = $db->query($query)){ echo "MEMORY USAGE before : ". memory_get_usage()."<br><br>"; $rows = array(); while($row = $r->fetch_assoc()){ $rows[]= $row; } echo "MEMORY USAGE after : ". memory_get_usage()."<br><br>"; //before: 660880 //after: 114655768 // # of records: around 30 thousands ?> 

Для меня имеет смысл, что для хранения этих многих результатов очень много памяти, но мне просто интересно, почему mysqli_result настолько мала. Не может быть, чтобы результаты были запрошены к dbase каждый раз, когда вызывается fetch_assoc. Итак, где же результаты сохраняются в памяти.

Существует огромная разница между получением результатов и сохранением указателя на ресурс.

Если вы echo $r; перед первым вызовом memory_get_usage(); , вы поймете, что это всего лишь указатель. Это указатель на ваш результирующий набор. Пока вы не получите результаты, набор результатов фактически не будет сохранен в памяти.

Я предлагаю вам запустить fetchAll() за то, что вы пытаетесь сделать. Это приведет к тому, что 1 метод получит доступ ко всем вашим результатам с лучшей производительностью, поскольку он заложен на расширении mysqli (C Library), а не в петле на PHP.

Вы также можете использовать функцию бесплатных результатов, чтобы очистить свои результаты от памяти, когда вы закончите с ними. Это похоже на закрытие курсора на Java, если вы знакомы.

Я думаю, вы должны это сделать:

 while($row = $r->fetch_assoc()){ //Do whatever you need with the record, then: unset($row); } с while($row = $r->fetch_assoc()){ //Do whatever you need with the record, then: unset($row); } 

То, как вы размещаете, собирает огромный массив в $rows , и использование памяти отражает это.