mysql_query() - память.

Wicked

Новичок
mysql_query() - память.

Я правильно понимаю, что когда выполняется mysql_query(), то _весь_ резалт сет высасывается на сторону пхп, и сохраняется в некоем буфере, из которого уже и происходит чтение с помощью mysql_fetch_*() ? Именно к такому выводу я пришел сегодня, хочу убедиться, что я не ошибся.
 

vovik

Новичок
Все правильно, именно так и происходит.
Учитывая, что над результатом запроса можно делать, например, mysql_num_rows(), данные уже должны быть в памяти PHP.
 

Wicked

Новичок
Они также могли бы находиться в буфере mysql'я, а mysql_num_rows спрашивал бы у mysql'я. Это единственный аргумент?
 

_vampiro_

Новичок
IMHO simpletest:

slelect * from test;

причем в результате выборки даных на memory_limit+1Mb.
 

Wicked

Новичок
Автор оригинала: _vampiro_
IMHO simpletest:

slelect * from test;

причем в результате выборки даных на memory_limit+1Mb.
Скрипт:

PHP:
phpinfo();
mysql_connect("192.168.1.174:3307", "root", "") or die(mysql_error());
mysql_select_db("enc12") or die(mysql_error());
print "Memory 1: ".memory_get_usage()."<br>";
$result = mysql_query("SELECT * FROM TEXTS") or die(mysql_error());
print "Num_rows: ".mysql_num_rows($result)."<br>";
print "Memory 2: ".memory_get_usage()."<br>";
Выдает пхпинфо со значением "memory_limit | 32M | 32M".
Затем идут принты:
Код:
Memory 1: 14072
Num_rows: 194719
Memory 2: 14160
при этом сама таблица TEXTS имеет такие характеристики:
Data_length: 95940864 (95MB)
Rows: 194719
Avg_row_length: 492

-~{}~ 27.06.06 18:10:

Т.е., даже если этот result set и переносится на сторону PHP, то его объем не конролируется memory_limit'ом и не улавливается memory_get_usage().
 

tony2001

TeaM PHPClub
>Т.е., даже если этот result set и переносится на сторону PHP, то его объем не
> конролируется memory_limit'ом и не улавливается memory_get_usage().
Точно.
Он хранится не самим PHP, а libmysqlclient, т.е. на общий объем свободной RAM влияет, но PHP это контролировать никак не может.
Не забывайте еще про unbuffered queries.
 

Wicked

Новичок
tony2001
спасибо за квалифицированный ответ.

Про unbuffered queries я не забываю. Насколько я понимаю, основное отличие между ними есть использование mysql_use_result() и mysql_store_result() (функции libmysql). И тут мне тоже было бы интересно кое-что уточнить. В случае с mysql_use_result получается, что на стороне пхп хранится только текущий ряд, и mysql_fetch_* читают непосредственно из сокета? Так что буферы используются только сетевые?
 

vovik

Новичок
Автор оригинала: Wicked
Они также могли бы находиться в буфере mysql'я, а mysql_num_rows спрашивал бы у mysql'я. Это единственный аргумент?
Прошу прощения за не совсем четкий ответ. Это был не аргумент. Аргумент такой, что я проверял это дело и не раз с этим сталкивался.

Написал просто для пояснения. Впрочем, пояснил коряво, что и следует из цитаты выше :)

Ну в общем разобрались уже :)
 
Сверху