zoukankan      html  css  js  c++  java
  • 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的行数。

  • 相关阅读:
    文件操作3
    文件操作2
    kubernetes快速应用入门
    kubeadm初始化kubernetes集群
    kubernetes基础概念
    变量
    字面值
    关键字
    标识符
    Ubuntu安装MySql5.7
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5056800.html
Copyright © 2011-2022 走看看