php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)使用方法差别
在mysql中 FOUND_ROWS()与COUNT(*)都能够统计记录。假设都一样为什么会有两个这种函数呢。以下我来介绍SELECT FOUND_ROWS()与COUNT(*)使用方法差别
SELECT语句中常常可能用LIMIT限制返回行数。
有时候可能想要知道假设没有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(); |
|
COUNT(*) 的略微不同之处在于,它返回检索行的数目, 不论其是否包括 NULL值。
SELECT 从一个表中检索。而不检索其他的列,而且没有 WHERE子句时。 COUNT(*)被优化到最快的返回速度。比如:
| 代码例如以下 | 复制代码 |
|
mysql> SELECT COUNT(*) FROM tablename; |
|
这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函数返回记录的精确数量,并且很easy訪问。
对于事务型的存储引擎(InnoDB, BDB), 存储一个精确行数的问题比較多。原因是可能会发生多重事物处理, 而每一个都可能会对行数产生影响。
COUNT(DISTINCT expr,[expr...])
返回不同的非NULL值数目。
若找不到匹配的项,则COUNT(DISTINCT)返回 0 。
PHP代码:
| 代码例如以下 | 复制代码 |
|
<?php $sql = "select count(*) from t"; $res = mysql_query($sql); $num = mysql_result($res,0); $sql = "select topic,detail from t limit 5"; //***下面我就不写了 ? > |
|
然而用mysql自带函数found_rows();
也能够高速求出总数
PHP代码:
| 代码例如以下 | 复制代码 |
|
<? php $sql = "select sql_calc_found_rows topic,detail from t limit 5"; $sql = "select found_rows()"; $num = mysql_result($res,0); ? > |
|
这样的方法使用时所要注意的问题
引用:
1 必须以select sql_calc_found_rows 开头
2 这时found_rows() 为 没有limite 时的行数
下面为一个演示 希望大家看了更加明确
PHP代码:
| 代码例如以下 | 复制代码 |
|
mysql> select count(*) from zd_sort2; +----------+ | count(*) | +----------+ | 20 | +----------+ 1 row in set (0.14 sec) mysql> select sql_calc_found_rows st2_id from zd_sort2 limit 3; +--------+ | st2_id | +--------+ | 1 | | 6 | | 12 | +--------+ 3 rows in set (0.00 sec) mysql> select found_rows(); +--------------+ | found_rows() | +--------------+ | 20 | +--------------+ 1 row in set (0.00 sec) mysql> |
|
着两中方法效率怎样呢
FOUND_ROWS()
A SELECT语句可能包含一个 LIMIT 子句。用来限制server返回client的行数。
在有些情况下,须要不用再次执行该语句而得知在没有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 选项,则使用LIMIT 和不使用时,FOUND_ROWS() 可能会返回不同的结果)。
通过 FOUND_ROWS()的有效行数是瞬时的,而且不用于越过SELECT SQL_CALC_FOUND_ROWS语句后面的语句。若你须要稍候參阅这个值。那么将其保存:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
mysql> SET @rows = FOUND_ROWS();
假如你正在使用 SELECT SQL_CALC_FOUND_ROWS, MySQL 必须计算出在所有结果集合中有所少行。然而, 这比不用LIMIT而再次执行问询要快,原因是结果集合不须要被送至client。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 在当你希望限制一个问询返回的行数时非常实用。同一时候还能不须要再次执行问询而确定所有结果集合中的行数。一个样例就是提供页式显示的Web脚本,该显示包括显示搜索结果其他部分的页的连接。
使用FOUND_ROWS() 使你确定剩下的结果须要多少其他的页。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的应用对于UNION 问询比对于简单SELECT 语句更为复杂。原因是在UNION 中,LIMIT 可能会出如今多个位置。
它可能适用于UNION中的个人 SELECT语句。或是整体上 到UNION 结果的全程。
SQL_CALC_FOUND_ROWS对于 UNION的意向是它应该不须要全程LIMIT而返回应返回的行数。SQL_CALC_FOUND_ROWS 和UNION 一同使用的条件是:
- SQL_CALC_FOUND_ROWS 关键词必须出如今UNION的第一个 SELECT中。
- FOUND_ROWS()的值仅仅有在使用 UNION ALL时才是精确的。
若使用不带ALL的UNION。则会发生两次删除, 而 FOUND_ROWS() 的指仅仅需近似的。
- 假若UNION 中没有出现 LIMIT 。则SQL_CALC_FOUND_ROWS 被忽略,返回暂时表中的创建的用来处理UNION的行数。
php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)使用方法差别的更多相关文章
- mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SEL ...
- mysql学习之完整的select语句
本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order by limit 首发日期:2018-04-11 完整语法: 先给一下完整的语法,后面将逐一来 ...
- 100道MySQL数据库经典面试题解析(收藏版)
前言 100道MySQL数据库经典面试题解析,已经上传github啦 https://github.com/whx123/JavaHome/tree/master/Java面试题集结号 公众号:捡田螺 ...
- 学习Nodejs之mysql
学习Nodejs连接mysql数据库: 1.先安装mysql数据库 npm install mysql 2.测试连接数据库: var sql = require("mysql"); ...
- 【转】MYSQL入门学习之七:MYSQL常用函数
转载地址:http://www.2cto.com/database/201212/175864.html 一.数学函数 www.2cto.com ABS(x) ...
- ref:学习笔记 UpdateXml() MYSQL显错注入
ref:https://www.cnblogs.com/MiWhite/p/6228491.html 学习笔记 UpdateXml() MYSQL显错注入 在学习之前,需要先了解 UpdateXml( ...
- 100道MySQL常见面试题总结,看完直接收藏
前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面 ...
- 100道MySQL常见面试题总结
原文链接:https://juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐 ...
- 面试必备的10道MySQL题
MySQL 事务,是我们去面试中高级开发经常会被问到的问题,很多人虽然经常使用 MySQL,SQL 语句也写得很溜,但是面试的时候,被问到这些问题,总是不知从何说起.下面我们先来了解一下什么是 MyS ...
随机推荐
- C++ Primer高速学习 第一章 获得二:输入和输出 (IO)
什么是输入输出.即Input-Output,缩写是非常装B的IO?请看经典民间解释: C++语言的输入输出是指信息从外部输入设备(如键盘.磁盘等)向计算机内部(内存)输入(即Input)和从内存向外单 ...
- 源码安装apache及配置转发
一. 安装Apache a) 解压:tar -xvf httpd-*; b) ./configure --prefix=/usr/oracle/apache CC="gcc ...
- 利用ffmpeg将H264解码为RGB
因为公司买到了一个不提供解码器的设备,我不得已还要做解码的工作.在网上找了一圈,H264解码比較方便的也就是ffmpeg一系列的函数库了,原本设备中也是用这套函数库解码,但厂家不给提供,没办法,仅仅得 ...
- cidaemon.exe过程cpu入住率和关闭cidaemon.exe加工方法
问题叙述性说明: 这个时间机器始终是一个奇怪的问题:cidaemon.exe这个过程需要CUP率98%以上,大大影响了正常使用电脑.多个资源管理器出现cidaemon.exe过程,cpu率最高的一 ...
- 图解Http协议 (转)
一.技术基石及概述 问:什么是HTTP? 答:HTTP是一个客户端和服务器端请求和响应的标准TCP.其实建立在TCP之上的. 当我们打开百度网页时,是这样的: https://www.baidu.co ...
- A WPF File ListView and ComboBox
源码下载: Download FileListView_Version_2.zip Download FileListView_Version_2_Binaries.zip Download File ...
- STM32本学习笔记EXTI(外部中断)
参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...
- Unity3D方法来隐藏和显示对象
Unity3D作 在使用unity3d开发游戏的过程中.我们经常会遇到须要隐藏或者显示的操作,针对这一点,以下做了一些总结. 一.设置Renderer状态 在游戏的开发中,全部可以被渲染的物体都包括有 ...
- 你的第一个AngularJS应用--教程二:基架、建立和測试的工具
介绍 有非常多可用的工具能够帮助你开发AngularJS 应用,那些非常复杂的框架不在我的讨论范围之中,这也是我開始这系列教程的原因. 在第一部分,我们掌握了AngularJS框架的基本结构,开发了第 ...
- OA项目设计的能力③
1.然后来了一个,写在我们的主要要求之一,有回波数据还需要添加的方法,我们需要知道,事实上,页被传递id演出id通讯实体name,所以想要回显就是须要得到privilegeIds,假设像上一篇在jsp ...