Mark Kirkwood wrote:
Chris wrote:
It's the same as doing a select count(*) type query using the same
clauses, but all in one query instead of two.
It doesn't return any extra rows on top of the limit query so it's
better than using pg_numrows which runs the whole query and returns it
to php (in this example).
Their docs explain it:
http://dev.mysql.com/doc/refman/4.1/en/information-functions.html
See "FOUND_ROWS()"
Note that from the same page:
"If you are using SELECT SQL_CALC_FOUND_ROWS, MySQL must calculate how
many rows are in the full result set. However, this is faster than
running the query again without LIMIT, because the result set need not
be sent to the client."
So it is not as cost-free as it would seem - the CALC step is
essentially doing "SELECT count(*) FROM (your-query)" in addition to
your-query-with-the-limit.
I don't buy the "its cheap 'cause nothing is returned to the client"
bit, because 'SELECT count(*) ...' returns only 1 tuple of 1 element to
the client anyway. On the face of it, it *looks* like you save an extra
set of parse, execute, construct (trivially small) resultset calls - but
'SELECT FOUND_ROWS()' involves that set of steps too, so I'm not
entirely convinced that doing a 2nd 'SELECT count(*)...' is really any
different in impact.
Sorry - I created a bit of confusion here. It's not doing the count(*),
it's doing the query again without the limit.
ie:
select SQL_CALC_FOUND_ROWS userid, username, password from users limit 10;
will do:
select userid, username, password from users limit 10;
and calculate this:
select userid, username, password from users;
and tell you how many rows that will return (so you can call
'found_rows()').
the second one does do a lot more because it has to send the results
across to the client program - whether the client uses that info or not
doesn't matter.
The OP didn't want to have to change to using two different queries:
select count(*) from table;
select * from table limit 10 offset 0;
Josh's comment was to do the query again without the limit:
select userid, username, password from users;
and then use something like http://www.php.net/pg_numrows to work out
the number of results the query would have returned.. but that would
keep the dataset in memory and eventually with a large enough dataset
cause a problem.
--
Postgresql & php tutorials
http://www.designmagick.com/