首页 > 代码库 > php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别
SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:
代码如下 | 复制代码 |
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS(); |
COUNT(*) 的稍微不同之处在于,它返回检索行的数目, 不论其是否包含 NULL值。
SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE子句时, COUNT(*)被优化到最快的返回速度。例如:
代码如下 | 复制代码 |
mysql> SELECT COUNT(*) FROM tablename; |
这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函数返回记录的精确数量,而且非常容易访问。对于事务型的存储引擎(InnoDB, BDB), 存储一个精确行数的问题比较多,原因是可能会发生多重事物处理, 而每个都可能会对行数产生影响。
COUNT(DISTINCT expr,[expr...])
返回不同的非NULL值数目。
若找不到匹配的项,则COUNT(DISTINCT)返回 0 。
PHP代码:
代码如下 | 复制代码 |
<?php $sql = "select count(*) from t"; $res = mysql_query($sql); $num = mysql_result($res,0); $sql = "select topic,detail from t limit 5"; //***以下我就不写了 ?> |
然而用mysql自带函数found_rows();
也可以快速求出总数
PHP代码:
代码如下 | 复制代码 |
<?php
$sql = "select sql_calc_found_rows topic,detail from t limit 5"; $sql = "select found_rows()"; $num = mysql_result($res,0); ?> |
这种方法使用时所要注意的问题
引用:
1 必须以select sql_calc_found_rows 开头
2 这时found_rows() 为 没有limite 时的行数
以下为一个演示 希望大家看了更加明白
PHP代码:
代码如下 | 复制代码 |
mysql> select count(*) from zd_sort2; +----------+ | count(*) | +----------+ | 20 | +----------+ 1 row in set (0.14 sec)
mysql> select sql_calc_found_rows st2_id from zd_sort2 limit 3; +--------+ | st2_id | +--------+ | 1 | | 6 | | 12 | +--------+ 3 rows in set (0.00 sec)
mysql> select found_rows(); +--------------+ | found_rows() | +--------------+ | 20 | +--------------+ 1 row in set (0.00 sec)
mysql> |
着两中方法效率如何呢
FOUND_ROWS()
A SELECT语句可能包括一个 LIMIT 子句,用来限制服务器返回客户端的行数。在有些情况下,需要不用再次运行该语句而得知在没有LIMIT 时到底该语句返回了多少行。为了知道这个行数, 包括在SELECT 语句中选择 SQL_CALC_FOUND_ROWS ,随后调用 FOUND_ROWS() :
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
第二个 SELECT返回一个数字,指示了在没有LIMIT子句的情况下,第一个SELECT返回了多少行 (若上述的 SELECT语句不包括 SQL_CALC_FOUND_ROWS 选项,则使用LIMIT 和不使用时,FOUND_ROWS() 可能会返回不同的结果)。
通过 FOUND_ROWS()的有效行数是瞬时的,并且不用于越过SELECT SQL_CALC_FOUND_ROWS语句后面的语句。若你需要稍候参阅这个值,那么将其保存:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
mysql> SET @rows = FOUND_ROWS();
假如你正在使用 SELECT SQL_CALC_FOUND_ROWS, MySQL 必须计算出在全部结果集合中有所少行。然而, 这比不用LIMIT而再次运行问询要快,原因是结果集合不需要被送至客户端。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 在当你希望限制一个问询返回的行数时很有用,同时还能不需要再次运行问询而确定全部结果集合中的行数。一个例子就是提供页式显示的Web脚本,该显示包含显示搜索结果其它部分的页的连接。使用FOUND_ROWS() 使你确定剩下的结果需要多少其它的页。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的应用对于UNION 问询比对于简单SELECT 语句更为复杂,原因是在UNION 中,LIMIT 可能会出现在多个位置。它可能适用于UNION中的个人 SELECT语句,或是总体上 到UNION 结果的全程。
SQL_CALC_FOUND_ROWS对于 UNION的意向是它应该不需要全程LIMIT而返回应返回的行数。SQL_CALC_FOUND_ROWS 和UNION 一同使用的条件是:
- SQL_CALC_FOUND_ROWS 关键词必须出现在UNION的第一个 SELECT中。
- FOUND_ROWS()的值只有在使用 UNION ALL时才是精确的。若使用不带ALL的UNION,则会发生两次删除, 而 FOUND_ROWS() 的指只需近似的。
- 假若UNION 中没有出现 LIMIT ,则SQL_CALC_FOUND_ROWS 被忽略,返回临时表中的创建的用来处理UNION的行数。