ITPub博客

首页 > 数据库 > 数据库开发技术 > 小白学习MySQL - 统计的"投机取巧"

小白学习MySQL - 统计的"投机取巧"

原创 数据库开发技术 作者:bisal 时间:2022-06-24 07:50:00 0 删除 编辑

MySQL中支持LIMIT子句,限制返回行数。如果先执行了LIMIT,我又想知道不带LIMIT能返回多少行,但又不想再执行一次相同的语句,这时能怎么做?


此时,可以利用MySQL提供的一个函数FOUND_ROWS()特性来解决。


(1) 首先,执行一次包含SQL_CALC_FOUND_ROWS选项的SELECT语句,

bisal@mysqldb 15:49:  [test]> select SQL_CALC_FOUND_ROWS * from tt limit 1;+------+---------------------+--------+| code | cdate               | ctotal |+------+---------------------+--------+| AAA  | 2022-01-01 00:00:00 |      1 |+------+---------------------+--------+1 row in set, 1 warning (0.00 sec)


(2) 执行FOUND_ROWS()函数,返回的就是这张表的记录数,

bisal@mysqldb 16:02:  [test]> select found_rows();+--------------+| found_rows() |+--------------+|           15 |+--------------+1 row in set, 1 warning (0.00 sec)


可以看到,和COUNT(*)的记录数,是相同的,

bisal@mysqldb 16:03:  [test]> select count(*) from tt;+----------+| count(*) |+----------+|       15 |+----------+1 row in set (0.01 sec)


之所以加上SQL_CALC_FOUND_ROWS,因为他是表示需要取得的结果数,为后面使用FOUND_ROWS()函数做铺垫。


如果执行LIMIT时没带SQL_CALC_FOUND_ROWS,

bisal@mysqldb 15:49:  [test]> select * from tt limit 1;+------+---------------------+--------+| code | cdate               | ctotal |+------+---------------------+--------+| AAA  | 2022-01-01 00:00:00 |      1 |+------+---------------------+--------+1 row in set (0.00 sec)


执行FOUND_ROWS()返回的就是上一条SELECT语句实际返回的行数,

bisal@mysqldb 15:49:  [test]> select found_rows();+--------------+| found_rows() |+--------------+|            1 |+--------------+1 row in set, 1 warning (0.00 sec)


FOUND_ROWS()得到的数据,只是临时的,执行下一条语句,就会失效,如果逻辑中需要用到,可以提前保存,例如在程序中定义变量存储。


关于FOUND_ROWS()在官网文档中有相关的介绍,

https://dev.mysql.com/doc/refman/5.7/en/information-functions.html


至于原理上,我没看过代码,但是我觉得SQL_CALC_FOUND_ROWS意思就是在执行的时候,可能就统计了一次表的记录数,存到了临时变量或者某个临时区域,所以要紧接着执行这个FOUND_ROWS(),得到这个值,虽然事儿该做什么还做什么,毕竟相当于MySQL替代我们做了这件事儿,至少从执行层面,还是有些帮助的。



小白学习MySQL

《小白学习MySQL - 增量统计SQL的需求》

《小白学习MySQL - 你碰到过这种无法登陆的场景?》

《小白学习MySQL - 不同版本创建用户的些许区别》

《小白学习MySQL - 随机插入测试数据的工具》

《小白学习MySQL - varchar类型字段为什么经常定义成255?》

《小白学习MySQL - 变通创建索引的案例一则》

《小白学习MySQL - “投机取巧”统计表的记录数》

《小白学习MySQL - 一次慢SQL的定位》

《小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响》

《小白学习MySQL - 聊聊数据备份的重要性》

《小白学习MySQL - InnoDB支持optimize table?》

《小白学习MySQL - table_open_cache的作用》

《小白学习MySQL - 表空间碎片整理方法》

《小白学习MySQL - 大小写敏感问题解惑》

《小白学习MySQL - only_full_group_by的校验规则》

《小白学习MySQL - max_allowed_packet》

《小白学习MySQL - mysqldump保证数据一致性的参数差异》

《小白学习MySQL - 查询会锁表?》

《小白学习MySQL - 索引键长度限制的问题》

《小白学习MySQL - MySQL会不会受到“高水位”的影响?》

《小白学习MySQL - 数据库软件和初始化安装》

《小白学习MySQL - 闲聊聊》


近期更新的文章:

《小白学习MySQL - 增量统计SQL的需求》

《腾讯会议号设计的几种猜测》

《充电宝的玄机》

《新赛季的中超和国安,荆棘中前行》

《Oracle的CTAS能不能将约束等属性带到新表?》


近期的热文:

《"红警"游戏开源代码带给我们的震撼》


文章分类和索引:

《公众号1000篇文章分类和索引》

原文作者:bisal的个人杂货铺;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
Oracle ACE,10g/11g OCP,11g OCM,国内首批Oracle YEP成员(Oracle Young Expert Program,Oracle用户组年轻专家项目),EXIN DevOps Master,Oracle爱好者,微信公众号:bisal的个人杂货铺

注册时间:2022-06-21

  • 博文量
    539
  • 访问量
    2801374