影响LIMIT子句使用的一个mysql配置项

select FOUND_ROWS()总是返回上一次select所返回的行数。它的结果受到上一次select中是否使用SQL_CALC_FOUND_ROWS的

影响
测试如下:

1.运行语句:select SQL_CALC_FOUND_ROWS * from penalties where amount>=20 limit 2

然后运行:select FOUND_ROWS();
返回的行数是:4

2.不使用SQL_CALC_FOUND_ROWS
select * from penalties where amount>=20 limit 2
然后运行:select FOUND_ROWS();
返回的行数是:2

结论:使用SQL_CALC_FOUND_ROWS后(在幕后计算找到的总行数,保存起来后面使用),FOUND_ROWS()是抛掉了LIMIT之后的结果数。
不使用SQL_CALC_FOUND_ROWS,FOUND_ROWS()是select语句返回的最终结果数。

select FOUND_ROWS()的最大用处是在翻页中,预先将总数保存在FOUND_ROWS()中。每次点击下一页的时候,显示总记录数,

就是读取FOUND_ROWS()函数的值。这样省去查询数据库,扫描表所有记录。

所使用到的特性是:通过设置SQL_CALC_FOUND_ROWS,FOUND_ROWS()的结果不受limit的影响,返回的将会是符合条件除limit

外的总行数。

网上看了一下,列出的问题如下:

在最上面的更新里有mysql的bug连接,4.1, 5.0, 5.1版本都有这个问题。mysql对FOUND_ROWS()函数优化不够,比如下面两个

SQL:
select sql_calc_found_rows last_name from contacts group by c_id order by last_name
limit 1;
有sql_calc_found_rows(19.38 秒)

select last_name from contacts group by c_id order by last_name limit 1;
没有 sql_calc_found_rows(3.13 秒)

差别高达8秒,可见mysql这方面的问题还是很大的,在这个bug没有修复之前,这些功能不值得使用。

时间: 2024-09-28 22:07:58

影响LIMIT子句使用的一个mysql配置项的相关文章

《Oracle SQL疑难解析》——1.12 查询的WHERE子句基于另一个查询的结果

1.12 查询的WHERE子句基于另一个查询的结果 Oracle SQL疑难解析 1.12.1 要解决的问题 我们要从某张表中查询数据,但查询条件依赖当时另一张表中的数据情况,所以不能直接把条件固定到语句中.具体地说,我们现在要做一个报告,把所有办公场所在北美的部门列出来. 1.12.2 解决方法 在HR SCHEMA中,DEPARTMENT表中有部门的信息,LOCATIONS表中有办公场所的信息: select department_name from hr.departments where

mysql-求一个Mysql语句 查询出当前周的数据按照天分组

问题描述 求一个Mysql语句 查询出当前周的数据按照天分组 SELECT DATE_FORMAT(uploadTime_beg%Y-%m-%d"") as time SUM(field01) as sumStatus1 SUM(field02) as sumStatus2 SUM(field03) as sumStatus3 SUM(field04) as sumStatus4 SUM(field05) as sumStatus5 FROM health_realdata WHERE

select-关于SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符号不正确

问题描述 关于SELECT 子句中包含一个保留字.拼写错误或丢失的参数,或标点符号不正确 MstrSelectSql = ""SELECT StuInfo.NO AS 学号StuInfo.Name AS 姓名StuInfo.Sex AS 性别StuInfo.BirDate AS 出生日期StuInfo.PolType AS 政治面貌StuScore.English AS 大学英语StuScore.Computer AS 计算机StuScore.Math AS 大学高等数学StuScor

并发-请教一个mysql批量更新时的deadlock问题?

问题描述 请教一个mysql批量更新时的deadlock问题? 数据是mysql 5.6 表引擎是innoDB,DAO是mybatis3 有个表,比如是订单-物品表,里面保存每个订单的所有物品清单 字段有:record_id(记录id,自增长),order_id(订单id),good_id(物品id)等其他字段.. 有个数据同步的业务场景 需要在一个事务里 先根据order_id做删除操作,delete from xxx where order_id=xx 然后再批量增加订单-物品清单inser

Linux有问必答:如何通过命令行创建和设置一个MySQL用户

Linux有问必答:如何通过命令行创建和设置一个MySQL用户 问题:我想要在MySQL服务器上创建一个新的用户帐号,并且赋予他适当的权限和资源限制.如何通过命令行的方式来创建并且设置一个MySQL用户呢? 要访问一个MySQL服务器,你需要使用一个用户帐号登录其中方可进行.每个MySQL用户帐号都有许多与之相关连的属性,例如用户名.密码以及权限和资源限制."权限"定义了特定用户能够在MySQL服务器中做什么,而"资源限制"为用户设置了一系列服务器资源的使用许可.创

记录一个mysql连接慢的问题

问题现象是这样的: 我在一台机器上(61.183.23.23)启动了一个mysql,然后开通一个账号可以从127.0.0.1或者从61.183.23.23访问.但是遇到一个问题就是使用下面两个命令行访问的时候,速度差别非常大: mysql –h 127.0.0.1 –u user mysql –h 61.183.23.23 –u user   然后我使用ping,判断两个IP的速度差不多. 使用127.0.0.1的IP速度比另一个快太多了.虽然说这里的61.183.23.23需要去外网走一圈,但

mysql语法错误-请教一个mysql创建查询表问题

问题描述 请教一个mysql创建查询表问题 create table student(stuId int(10) not null auto_increment primary key comment '主键',stuNum varchar(50) default null comment '学号',stuName varchar(50) default null comment '名字',stuPwd varchar(25) default null comment '密码',stuSex v

SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符号不正确......????

问题描述 下面这样正常:strComm="selecttop10*fromregtablewhere(s_zhong='未中奖'ors_zhong=''ors_zhongisnull)ands_time>=@timeFromands_time<=@timeTo";System.Data.OleDb.OleDbParameter[]paras=newSystem.Data.OleDb.OleDbParameter[2];paras[0]=newSystem.Data.OleD

Linux有问必答:如何在命令行创建一个MySQL数据库

Linux有问必答:如何在命令行创建一个MySQL数据库 问题:在一个某处运行的MySQL服务器上,我该怎样通过命令行创建和安装一个MySQL数据库呢? 为了能通过命令行创建一个MySQL数据库,你可以使用mysql命令行客户端.下面是通过mysql命令行客户端创建和安装MySQL的步骤. 第一步:安装MySQL客户端 当然你得确保MySQL客户端已经安装完毕.如果没有的话,可以按照下面的方法. 在Debian,Ubuntu 或者 Linux Mint上: $ sudo apt-get inst