美文网首页
mysql分页场景下SQL_CALC_FOUND_ROWS代替c

mysql分页场景下SQL_CALC_FOUND_ROWS代替c

作者: 小胖学编程 | 来源:发表于2021-11-22 16:11 被阅读0次

    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将会返回多少行。

    效果图.png

    如果您使用的是SELECT SQL_CALC_FOUND_ROWS,MySQL 必须计算整个结果集中有多少行。但是,这比不使用LIMIT再次运行查询要快,因为不需要将结果集发送到 Client 端。

    中文——mysql5.7官方文档

    2. mysql8.x版本

    在mysql8.0版本的官方文档中,不推荐使用SQL_CALC_FOUND_ROWS选项,并计划在后续版本中废弃。

    mysql8.0版本.png

    mysql8.0文档


    注意:

    mysql会为当前连接保存这个值,各个连接的SQL_CALC_FOUND_ROWS结果互不影响

    两条sql语句可以简化成一条sql语句,看似简单了,实则不然。

    原因:

    1. 在有索引覆盖的情况下,SQL_CALC_FOUND_ROWS 和 COUNT(*)的效率差不多

    2. 在没有索引覆盖的情况下,SQL_CALC_FOUND_ROWS的效率要远低于COUNT(*)的效率,大概只有COUNT(*)的十分之一,甚至更低

    来源——SQL_CALC_FOUND_ROWS的用法

    推荐阅读

    哪个最快?SELECT SQL_CALC_FOUND_ROWS FROM table,或 SELECT COUNT(*)

    相关文章

      网友评论

          本文标题:mysql分页场景下SQL_CALC_FOUND_ROWS代替c

          本文链接:https://www.haomeiwen.com/subject/dsebtrtx.html