首页 > 数据库 >别使用 MySQL 的 SQL_CALC_FOUND_ROWS 来获取总行数

别使用 MySQL 的 SQL_CALC_FOUND_ROWS 来获取总行数

时间:2022-12-16 14:33:21浏览次数:38  
标签:语句 ROWS MySQL SQL FOUND CALC SELECT

当我们在处理分页程序的时候,会使用 limit 来限制返回的数量,然后会有两种获取分页的方法:

第一种方法:

在 SELECT 语句中加入 SQL_CALC_FOUND_ROWS 选项,然后通过 SELECT FOUND_ROWS() 来获取总行数:

SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

其中的 SQL_CALC_FOUND_ROWS 语句会统计出符合筛选条件的记录总数,保存在mysql 端;

后面使用 SELECT FOUND_ROWS() 语句可以得到这个数字,不用再次计算。当然,如果你再次运行了SQL_CALC_FOUND_ROWS的话,这个数字就会被覆盖成最新的。

如果在前一条语句中没有使用SQL_CALC_FOUND_ROWS选项,SELECT FOUND_ROWS()将返回前一条语句实际返回的行数

注意

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

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

原因

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

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

第二种方式:

使用正常的 SQL 语句,然后再用 SELECT COUNT(*) 来获取总行数:

SELECT * FROM table WHERE id > 100 LIMIT 10;
SELECT COUNT(*) FROM table WHERE id > 100;

经过测试,一般来说 SQL_CALC_FOUND_ROWS 是比较慢的,SQL执行的时间甚至会达到10倍那么夸张,所以最好别使用 MySQL 的 SQL_CALC_FOUND_ROWS 来获取总行数

记得尽量使用索引覆盖,这样count(索引列)可以使用到索引覆盖,效率很高。

标签:语句,ROWS,MySQL,SQL,FOUND,CALC,SELECT
From: https://www.cnblogs.com/xupeixuan/p/16987291.html

相关文章

  • Ubuntu安装、配置Mysql8.0
    安装在线安装,依次执行如下命令sudoapt-getinstallmysql-serversudoaptinstallmysql-clientsudoaptinstalllibmysqlclient-dev安装完成后,输入sudonetstat......
  • 解决使用innobackupex备份mysql产生returned OS error 124【转】
    ###简介今天在使用innobackupex全量备份数据库的时候发生了下面的错误错误详情19070515:22:18>>logscannedupto(258819807308)xtrabackup:Generatingalist......
  • MySQL之删除
    方式一、语法:1.单表删除deletefrom表名where筛选条件#案例:删除手机号9结尾的女生信息deletefrombeautywherephonelike'%9';select*frombeauty方式二......
  • SQL server 2017安装教程
    原文链接:https://blog.csdn.net/xqe777/article/details/127330683SQLserver2017安装教程SQLserver简介安装步骤结束语......
  • MySQL学习笔记2
    MySQL学习笔记2     导入sql文件mysql导入sql文件(命令行方式)1. 打开数据库命令行窗口;输入密码登录数据库;2. 查看所有数据库showdatabases;,并选择要......
  • C# 的DateTime 和 Mysql 的10位时间戳 转化
    1.将Unix时间戳转换为DateTime类型时间 publicstaticSystem.DateTimeConvertIntDateTime(longd){System.DateTimetime=System.DateTime.MinValue;System.Date......
  • Windows下安装mysql-python(MySQLdb)问题记录
    今天太倒霉了,这篇文章马上就要写完了,结果火狐崩溃了,而且csdn居然没有自动保存,只有上午的有记录;想到这个安装的问题也折腾哥快一天了,还是再次打字把问题记录下吧,我就喜欢偏......
  • MySQL之修改
    一、修改记录update表名set列=新值,列=新值,...where筛选条件#1.修改单表的记录#案例一、修改beauty表中姓唐的电话号码为138998899updatebeautysetpho......
  • Kylin-最小化编译安装MySQL
    Kylin-最小化编译安装MySQL编译环境部署安装编译软件[root@server2local]#dnfinstallgccgcc-c++ncursesncurses-develcmakebisonperlmaketar-yInstalle......
  • MySQL系列之什么是CROSS JOIN
    文章目录​​1.crossjoin简介​​​​2.crossjoin用法​​本博客例子自两篇博客的:​​http://www.mysqltutorial.org/mysql-cross-join/​​​​https://www.w3resourc......