Friday, November 19, 2010

MySQL: обработка больших наборов данных

Большинство клиентских библиотек для работы с MySQL после выполнения запроса по умолчанию загружают весь result set в память. Это удобно: поскольку все строки уже находятся в памяти клиента, к ним можно обращаться в произвольном порядке. Также, доступно общее число строк. Недостаток - требования к памяти и ошибки "Out of memory" при достаточно больших наборах данных.

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

Первый способ использует для получения результатов запроса функцию MySQL API mysql_store_result, а второй - mysql_use_result. В перловом DBD::mysql использование mysql_use_result можно включить установкой одноименного атрибута dbh:
mysql_use_result

This attribute forces the driver to use mysql_use_result rather than mysql_store_result. The former is faster and less memory consuming, but tends to block other processes. (That's why mysql_store_result is the default.)

It is possible to set default value of the mysql_use_result attribute for $dbh using several ways:

- through DSN

$dbh= DBI->connect("DBI:mysql:test;mysql_use_result=1", "root", "");

- after creation of database handle

$dbh->{'mysql_use_result'}=0; #disable
$dbh->{'mysql_use_result'}=1; #enable


Недостатком этого метода является то, что пока не будут получены все данные из result set, в рамках соединения запрещено использовать новые запросы. Попытка выполнить новый запрос приводит к ошибке
Commands out of sync; you can't run this command now

No comments:

Post a Comment