1. mysql5.x版本
分页场景下,我们希望语句在没有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
,MySQL 必须计算整个结果集中有多少行。但是,这比不使用LIMIT再次运行查询要快,因为不需要将结果集发送到 Client 端。
2. mysql8.x版本
在mysql8.0版本的官方文档中,不推荐使用SQL_CALC_FOUND_ROWS
选项,并计划在后续版本中废弃。

注意:
mysql会为当前连接保存这个值,各个连接的SQL_CALC_FOUND_ROWS结果互不影响
两条sql语句可以简化成一条sql语句,看似简单了,实则不然。
原因:
-
在有索引覆盖的情况下,SQL_CALC_FOUND_ROWS 和 COUNT(*)的效率差不多
-
在没有索引覆盖的情况下,SQL_CALC_FOUND_ROWS的效率要远低于COUNT(*)的效率,大概只有COUNT(*)的十分之一,甚至更低
推荐阅读
哪个最快?SELECT SQL_CALC_FOUND_ROWS FROM table
,或 SELECT COUNT(*)
网友评论