(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_query결과 행을 버퍼링하지도 인출하지도 않으면서 MySQL로 SQL 질의를 전송


resource mysql_unbuffered_query ( string $query [, resource $link_identifier ] )

mysql_unbuffered_query()는 SQL 질의를 결과 행들을 버퍼링하지도 인출하지도 않고 query를 MySQL로 전송한다. 한편, 이는 거대한 결과 집합을 만드는 SQL 질의로 점유하는 메모리를 절약한다. 또한, 완료된 SQL 질의가 수행될 때까지 기다리지 않고, 첫행이 조회된 이후로 즉시 작업을 시작할 수 있다. 다중 DB-접속을 사용할 때, 옵션 인수인 link_identifier를 지정해야한다.



SQL 질의문


MySQL 연결. 지정하지 않으면 mysql_connect()로 연 마지막 연결을 사용합니다. 연결이 없으면, 인수 없이 mysql_connect()를 호출하여 연결을 만듭니다. 연결이 성립되지 않으면 E_WARNING 등급의 오류를 생성합니다.


SELECT, SHOW, DESCRIBE, EXPLAIN 구문에서 mysql_unbuffered_query()가 성공하면 resource를 에러가 발생하면 FALSE를 반환한다.

UPDATE, DELETE, DROP 등과 같은 SQL 구문에서 mysql_unbuffered_query()가 성공하면 TRUE를 에러가 발생하면 FALSE를 반환한다.



mysql_unbuffered_query()의 이점은 비용에서 온다: mysql_unbuffered_query()로부터 반환된 결과 집합은 mysql_num_rows()mysql_data_seek()에서 사용할 수 없다. 또한, MySQL로 새로운 SQL 질의를 전송하기 전에 비-버퍼링 SQL 질의로부터의 모든 결과 행을 인출해야한다.


add a note add a note

User Contributed Notes 5 notes

frappyjohn at dos2linux dot org
17 years ago
Don't let the two hands confuse you, these are both advantages (they should really be on the same hand):

On the one hand, this saves a considerable amount of memory with SQL queries that produce large result sets.

On the other hand, you can start working on the result set immediately ...
crazyone at crazycoders dot net
12 years ago
You are NOT required to read all rows from the resultset when using unbuffered query, you may opt out at any time and use mysql_free_result. Imagine looking at 1 million row when the first 50 suffice? Just free the result and you are good to go again.
post at jfl dot dk
16 years ago
If using optimized MyISAM tables I guess there is a big advantage with this function as it is possible to do selects and inserts on the same time as long as no rows in the table gets updated.
shaner at accretivetg dot com
17 years ago
Regarding bailing on a really large result, while doing an unbuffered query, there _is_ a way to do this: kill the thread and exit your processing loop.  This, of course, requires having a separate database link.  Something like below does the trick:

// a db link for queries
$lh  = mysql_connect( 'server', 'uname', 'pword' );
// and a controller link
$clh = mysql_connect( 'server', 'uname', 'pword', true );

if (
mysql_select_db ( 'big_database', $lh ) )
$began  time();
$tout   = 60 * 5; // five minute limit
$qry    = "SELECT * FROM my_bigass_table";
$rh     = mysql_unbuffered_query( $qry, $lh );
$thread = mysql_thread_id ( $lh );
  while (
$res = mysql_fetch_row( $rh ) )
/* do what you need to do
     * ...
     * ...
if ( ( time() - $began ) > $tout )
// this is taking too long
mysql_query( "KILL $thread", $clh );
david at php dot net
18 years ago
You are absolutely required to retrieve all rows in the result set (option 'a' in the first comment). If you fail to do so, PHP will do so for you, and will emit a NOTICE warning you of the fact. From the MySQL API, "Furthermore, you must retrieve all the rows even if you determine in mid-retrieval that you've found the information you were looking for. ".

Also note that if you are using this function, you should be quick about processing the result set, or you will tie up the MySQL server (other threads will be unable to write to the tables you are reading from).

If you want to be able to 'abort' mid result-set or if you want to do lengthy processing on the results, you are misunderstanding the purpose of this function.

Also note that UPDATE queries etc return no result set, so this function is only useful for SELECT etc.
To Top