PHP Doku:: Sendet eine SQL Anfrage an MySQL, ohne Ergebniszeilen abzuholen und zu puffern. - function.mysql-unbuffered-query.html

Verlauf / Chronik / History: (2) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDatenbankerweiterungenAnbieterspezifische DatenbankerweiterungenMySQLMySQL Funktionenmysql_unbuffered_query

Ein Service von Reinhard Neidl - Webprogrammierung.

MySQL Funktionen

<<mysql_thread_id

MySQL Improved Extension>>

mysql_unbuffered_query

(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_querySendet eine SQL Anfrage an MySQL, ohne Ergebniszeilen abzuholen und zu puffern.

Beschreibung

resource mysql_unbuffered_query ( string $Anfrage [, resource $Verbindungs-Kennung ] )

mysql_unbuffered_query() sendet eine SQL Anfrage an MySQL, ohne dass die Datensätze des Ergebnisses automatisch geholt und gepuffert werden, wie es bei der Verwendung von mysql_query() der Fall ist. Einerseits spart dieses Vorgehen eine erhebliche Menge an Speicher bei SQL Anfragen ein, die große Ergebnismengen liefern. Andererseits können Sie unmittelbar mit dem Anfrageergebnis arbeiten, sobald der erste Datensatz gefunden wurde: Sie müssen nicht darauf warten, bis die gesamte SQL Anfrage abgeschlossen ist. Wird auf verschiedene Datenbanken gleichzeitig zugegriffen, muss der optionale Parameter Verbindungs-Kennung angegeben werden.

Hinweis:

Die Vorteile von mysql_unbuffered_query() haben ihren Preis: Auf ein Ergebnis von mysql_unbuffered_query() können die Funktionen mysql_num_rows() und mysql_data_seek() nicht angewendet werden. Ausserdem müssen Sie sicherstellen, dass Sie alle Datensätze des Ergebnisses einer ungepufferteten SQL Anfrage abgeholt haben. Erst dann können Sie eine neue SQL Anfrage an MySQL absetzen.

Siehe auch: mysql_query().


13 BenutzerBeiträge:
- Beiträge aktualisieren...
snail2008 at gmail dot com
9.12.2009 9:37
when you use the mysql_free_result,it will still fetch all rows from the result set.So the which operation will cost less memory,fetch the first 50 rows and use the mysql_free_result or fetch all rows.
if the behaviour remains the same,the advantge of the mysql_unbuffered_query is just the immediately action rather than saves a considerable amount of memory.
markus at buyways dot nl
20.08.2008 10:51
@crazyone

as stated elsewhere, bear in mind that the MySQL API will still fetch all rows from MySQL when using the mysql_free_result() function. MySQL behaviour will not change through clientside coding.

So if you request a million rows while the first 50 rows suffice, then you still missed the point of unbuffered queries.

The manual is correct, you still need to fetch all rows from the result set whether you do it manually or through mysql_free_result(), the behaviour remains the same.
crazyone at crazycoders dot net
27.05.2008 18:47
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.
Typer85 at gmail dot com
28.12.2006 1:33
In response to "silvanojr at gmail dot com".

Your misunderstanding the point of this function. You MUST retrieve all rows in the result set BEFORE you issue another query.

Yes you can do a SQL_CALC_ROWS but that would mean you would have to query MySQL, thus either firing an error or deleting the previous query's result set as the new unbuffered result set would point to the result of the call to SQL_CALC_ROWS.

Keep that in mind folks,
silvanojr at gmail dot com
12.05.2006 23:02
Note:  The benefits of mysql_unbuffered_query() come at a cost: You cannot use mysql_num_rows() and...

but it looks like you can use SQL_CALC_ROWS on MySQL to get the total rows without the limit.
andre dot steffens at adress-research dot de
8.10.2004 15:18
If you use mysql_ping() to check the connection, the resultset from mysql_unbuffered_query() will be kill.
steve_stockman at mac dot symantec dot com
2.04.2004 0:19
If you are going to do a large query, but are concerned about blocking access to the table during an unbuffered query, why not go through a temporary table? (Of course, this is predicated on the current user having permission to create tables.)

$dbQuery = "SELECT something ...";
if (mysql_query ("CREATE TEMPORARY TABLE MyQuery $dbQuery")) {
    $numRows = mysql_affected_rows();
    if ($numRows == 0) {
        /* handle empty selection */
    } else {
        $result = mysql_unbuffered_query ('SELECT * FROM MyQuery');
        /* handle result */
    }
    mysql_query ('DROP TABLE MyQuery');
}
post at jfl dot dk
30.11.2003 2:57
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.

14.06.2003 19:35
The other hand should really be, that the table remains locked until all rows have been retrieved, right?  This is a very important thing to mention, you could tie up the whole database with a lock.
shaner at accretivetg dot com
22.05.2003 1:45
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 );
      break;
    }
  }
}
frappyjohn at dos2linux dot org
18.02.2003 7:21
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 ...
david at php dot net
18.05.2002 6:25
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.
chabotc at reviewboard dot com
21.08.2001 11:21
Stefan,
unbuffered query sends a query to the server, and does not first download the results before sending them to the end-user (php in this case).

So what it means is that -normaly- you could do this:

$res1 = mysql_query("select some",$db_conn);
while ($row = mysql_fetch_row($res)) {
  $res2 = mysql_query("select some other",$db_conn);
  // do some other stuff
}

With an unbuffered query you could NOT do this, the result set from $res1 would be LOST on the second query.

However, it does not mean you -have- to fetch all rows ... just that the API does not save the result set in memory for you.

However, when using different db connections, it all works ofcource ...

For more information, please refer to the mysql manual, they have a lot of docs on query & unbuffered queries (the php api is just a basic wrapper around there native api's).



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)