首页 > 数据库 >mysql中count(*)和found_rows()的区别

mysql中count(*)和found_rows()的区别

时间:2023-07-05 10:23:09浏览次数:35  
标签:count FOUND ROWS rows mysql found SELECT

count(*)和found_rows()都可以用来求查询记录的数量

而count(*)往往单独使用,found_rows()却可以跟上前面一个查询,即select * from table limit 10; select found_rows();这样的

总共可分为几个区别:1.count(*)查询的无论是否为空,都会计数,而found_rows()却不是

          2.两者实现的原理不同。count(*)是通过查询表中的数目去计算的,而found_rows是根据下标去计算的

              我的猜想是,当前面没有查询条件,如上面的select * from table limit 10; 时,可以用count(*)去做,让他去遍历一遍表,比较适合。

          假设上面已经遍历了一遍你想要的元素,你想要计算的话,用found_rows()这个函数去做比较适合。

 

FOUND_ROWS()

    SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了。

 

 例如:需要取出一张表的前10行,同时又需要取出符合条件的总数。这在某些翻页操作中很常见

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

 

 表示的是:

在上一查询之后,你只需要用FOUND_ROWS()就能获得查询总数,这个数目是抛掉了LIMIT之后的结果数

 其中第一个sql里面的SQL_CALC_FOUND_ROWS不可省略,它表示需要取得结果数,也是后面使用FOUND_ROWS()函数的铺垫。

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

FOUND_ROWS()得到的数字是临时的,执行下一条语句就会失效。如果想要这个数字,就要将它保存下来

 mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
 mysql> SET @rows = FOUND_ROWS();

 

 如果使用 SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算所有结果集的行数。尽管这样,
总比再执行一次不使用LIMIT的查询要快多了吧,因为那样结果集要返回客户端的


 

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

SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:

 
  1.   mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
  2.   -> WHERE id > 100 LIMIT 10;
  3.   mysql> SELECT FOUND_ROWS();

 

COUNT(*) 的稍微不同之处在于,它返回检索行的数目, 不论其是否包含 NULL值。

SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE子句时, COUNT(*)被优化到最快的返回速度。例如:

 
mysql> SELECT COUNT(*) FROM tablename;

 

这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函数返回记录的精确数量,而且非常容易访问。对于事务型的存储引擎(InnoDB, BDB), 存储一个精确行数的问题比较多,原因是可能会发生多重事物处理, 而每个都可能会对行数产生影响。

COUNT(DISTINCT expr,[expr...])

返回不同的非NULL值数目。

若找不到匹配的项,则COUNT(DISTINCT)返回 0 。

 

<?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
 
    $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 时的行数
以下为一个演示 希望大家看了更加明白

 

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>

 

参考:

https://www.cnblogs.com/yzjT-mac/p/6478530.html

https://www.cnblogs.com/hwaggLee/p/4495973.html

https://blog.csdn.net/myweishanli/article/details/40584597

 

标签:count,FOUND,ROWS,rows,mysql,found,SELECT
From: https://www.cnblogs.com/rxbook/p/17527817.html

相关文章

  • vue 基于 CountUp.js,可用于创建显示数字数据的动画。
    地址:https://github.com/xlsdg/vue-countup-v2Installation$npminstall--savecountup.jsvue-countup-v2Usage<template><divclass="iCountUp"><ICountUp:delay="delay":endVal="endVal"......
  • Getting Started with Eclipse and Counterclockwise
    http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+CounterclockwiseGotostartofmetadata InstallEclipse(IfyoudonothaveEclipseinstalled,oryouwanttomakeisolatedtestsoftheClojurepluginforEclipse)GrabtheEcli......
  • Delphi 通过WebBrowser调用JS方法
    Delphi通过WebBrowser调用JS时,为防止版本问题导致调用失败,需要在html中增加 <metahttp-equiv="X-UA-Compatible"content="IE=edge"/>示例html代码<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <metahttp-eq......
  • 【转】python踩坑(FileNotFoundError: Could not find module '此处省略了一些路径win_
    1、报错(FileNotFoundError:Couldnotfindmodule'此处省略了一些路径\site-packages\scipy\.libs\libbanded5x.GL5FZ7Y77HIKQFNMZKUOMV5GID6YMX2V.gfortran-win_amd64.dll'(oroneofitsdependencies).Tryusingthefullpathwithconstructorsyntax.) 2、分析&a......
  • JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
    使用JSON,在SERVLET或者STRUTS的ACTION中取得数据时,如果会出现异常:java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher是因为需要的类没有找到,一般,是因为少导入了JAR包,使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-bean......
  • 14 | count(*)这么慢,我该怎么办?
    一下内容出自《MySQL实战45讲》14|count(*)这么慢,我该怎么办?count(*)的实现方式不同的MySQL引擎中,count(*)有不同的实现方式。MyISAM引擎把一个表的总行数存在了磁盘上,执行count(*)的时候会直接返回这个数,效率很高;InnoDB引擎就执行count(*)的时候,需要把数......
  • 11.5 throws关键词
    demo1classMyMath{ publicstaticintdiv(intx,inty)throwsException{ returnx/y; }}publicclassJavaDemo{ publicstaticvoidmain(Stringargs[]){ try{//调用throws方法时,需要进行异常处理,否则报错 System.out.println(MyMath.div(10,2)); ......
  • 启动mysql时报错Failed to start mysqld.service: Unit not found
    问题描述:启动mysql时报错Failedtostartmysqld.service:Unitnotfound,如下所示:数据库:mysql5.7.42系统:rhel7.31、问题重现--mysql安装过程[root@leo-mysql-master~]#yumlocalinstallhttps://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm[root@leo......
  • Arrangement排列•Combination组合•Counting计数•Binomial Theorem二项式定理
    符号C-Combination组合数[1]A-Arrangement(旧教材为P-Permutation)N-Number元素的总个数(自然数集合).M-参与选择的元素个数(M不大于N,两者都是自然数集合).!-Factorial阶乘.Arrangement排列与Combination组合:注意:n,m都是自然数,且m<=n,下同.排列的定义:从n......
  • PyCharm 运行时报错 allure: command not found
    安装Allure(Mac)方法一brewinstallallure方法二可能因为网络等,方式一会下载失败,可以通过以下方式安装1.https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/下载对应版本的压缩包2.配置环境变量-exportPATH=$PATH:/Users......