在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(*)使用方法差别的更多相关文章

  1. mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

    在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别   SEL ...

  2. mysql学习之完整的select语句

    本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order by limit 首发日期:2018-04-11 完整语法: 先给一下完整的语法,后面将逐一来 ...

  3. 100道MySQL数据库经典面试题解析(收藏版)

    前言 100道MySQL数据库经典面试题解析,已经上传github啦 https://github.com/whx123/JavaHome/tree/master/Java面试题集结号 公众号:捡田螺 ...

  4. 学习Nodejs之mysql

    学习Nodejs连接mysql数据库: 1.先安装mysql数据库 npm install mysql 2.测试连接数据库: var sql = require("mysql"); ...

  5. 【转】MYSQL入门学习之七:MYSQL常用函数

    转载地址:http://www.2cto.com/database/201212/175864.html 一.数学函数  www.2cto.com           ABS(x)           ...

  6. ref:学习笔记 UpdateXml() MYSQL显错注入

    ref:https://www.cnblogs.com/MiWhite/p/6228491.html 学习笔记 UpdateXml() MYSQL显错注入 在学习之前,需要先了解 UpdateXml( ...

  7. 100道MySQL常见面试题总结,看完直接收藏

    前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面 ...

  8. 100道MySQL常见面试题总结

    原文链接:https://juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐 ...

  9. 面试必备的10道MySQL题

    MySQL 事务,是我们去面试中高级开发经常会被问到的问题,很多人虽然经常使用 MySQL,SQL 语句也写得很溜,但是面试的时候,被问到这些问题,总是不知从何说起.下面我们先来了解一下什么是 MyS ...

随机推荐

  1. erlang集群IP及port管理

    erlang集群是依靠epmd维护的,epmd是erlang集群节点间port映射的守护进程.负责维护集群内的节点连接.提供节点名称到IP地址及port的解析服务. epmd 自己定义port号 ep ...

  2. iOS8互动的新通知

    iOS8一旦远程通知想必大家都很熟悉.不要做过多的描述在这里,直接推出iOS8交互式远程通知. 再看互动的通知电话,显示的形式                  如今来看一下详细实现方式 一.通过调用 ...

  3. swift-辞典NSDictionary定义,变化的关键,删/加入关键

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...

  4. HDU4870:Rating(DP)

    Problem Description A little girl loves programming competition very much. Recently, she has found a ...

  5. ASP.NET回车提交事务

    浅析ASP.NET回车提交事件[转] ASP.NET回车提交事件其实说到底并不是ASP.NET 的编程问题,却是关于html form 中的submit 按钮就是如何规划的具体讨论. 也可归于ASP. ...

  6. Js常用技巧

    摘录:http://crasywind.blog.163.com/blog/static/7820316920091011643149/ js 常用技巧 1. on contextmenu=" ...

  7. kNN(K-Nearest Neighbor)最近的分类规则

    KNN最近的规则,主要的应用领域是未知的鉴定,这一推断未知的哪一类,这样做是为了推断.基于欧几里得定理,已知推断未知什么样的特点和最亲密的事情特性: K最近的邻居(k-Nearest Neighbor ...

  8. 修改easyui datebox默认日期格式

    问题描述: 根据jquery easyui datebox demo中给的示例,导入和使用datebox, 发现日期格式为: 6/22/2011, 其他的今天和关闭也是 Today, Close, 对 ...

  9. [Windows Phone] 以多国语言做为开发前提 (1)

    原文:[Windows Phone] 以多国语言做为开发前提 (1) ? 前言 在先前 TechDays 2013 的课程 [开发 Windows Phone 商务应用程式就是这麽快] 中,其中一个部 ...

  10. java多线程Future和Callable类的解释与使用

    一,描写叙述 ​在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...