mysql中count(*)和found_rows()的区别
count(*)和found_rows()都可以用来求查询记录的数量
而count(*)往往单独使用,found_rows()却可以跟上前面一个查询,即select * from table limit 10; select found_rows();这样的
总共可分为几个区别:1.count(*)查询的无论是否为空,都会计数,而found_rows()却不是
2.两者实现的原理不同。count(*)是通过查询表中的数目去计算的,而found_rows是根据下标去计算的
我的猜想是,当前面没有查询条件,如上面的select * from table limit 10; 时,可以用count(*)去做,让他去遍历一遍表,比较适合。
假设上面已经遍历了一遍你想要的元素,你想要计算的话,用found_rows()这个函数去做比较适合。
FOUND_ROWS()
SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了。
例如:需要取出一张表的前10行,同时又需要取出符合条件的总数。这在某些翻页操作中很常见
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS()
表示的是:
在上一查询之后,你只需要用FOUND_ROWS()就能获得查询总数,这个数目是抛掉了LIMIT之后的结果数
其中第一个sql里面的SQL_CALC_FOUND_ROWS不可省略,它表示需要取得结果数,也是后面使用FOUND_ROWS()函数的铺垫。
第二个SELECT将返回第一条SELECT如果没有LIMIT时返回的行数,
如果在前一条语句中没有使用SQL_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数。
FOUND_ROWS()得到的数字是临时的,执行下一条语句就会失效。如果想要这个数字,就要将它保存下来
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS();
如果使用 SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算所有结果集的行数。尽管这样,
总比再执行一次不使用LIMIT的查询要快多了吧,因为那样结果集要返回客户端的
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 。
1 2 3 4 5 6 7 | <?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 $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 时的行数
以下为一个演示 希望大家看了更加明白
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>
参考:
https://www.cnblogs.com/yzjT-mac/p/6478530.html
https://www.cnblogs.com/hwaggLee/p/4495973.html
https://blog.csdn.net/myweishanli/article/details/40584597
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2017-07-05 vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)
2017-07-05 vagrant系列教程(二):vagrant的配置文件vagrantfile详解(转)
2017-07-05 vagrant系列教程(三):vagrant搭建的php7环境(转)
2017-07-05 vagrant系列教程(一):vagrant的安装与初识(转)