【问题标题】:SQL & PHP - Which is faster mysql_num_rows() or 'select count()'?SQL & PHP - mysql_num_rows() 或 'select count()' 哪个更快?
【发布时间】:2011-01-29 22:10:50
【问题描述】:

我只是想知道如果我只是想获取表中的行数,哪种方法最有效。

$res = mysql_query("SELECT count(*) as `number` FROM `table1`");
$count = mysql_fetch_result($res,0,'number');

$res = mysql_query("SELECT `ID` FROM `table1`");
$count = mysql_num_rows($res);

有人对此做过任何体面的测试吗?

【问题讨论】:

    标签: php sql performance


    【解决方案1】:

    mysql_query() 在返回之前将所有结果记录从 MySQL 传输到 php 进程中(与 mysql_unbufferd_query() 不同)。仅此一项就会使 mysql_num_rows() 版本变慢。

    此外,对于某些引擎(如 MyISAM),MySQL 可以从表 without hitting the actual data 的索引中处理 Count(*) 请求。另一方面,SELECT * FROM foo 会导致全表扫描,MySQL 必须读取每个数据集。

    【讨论】:

    • 谢谢大家的帖子,只好挑一个。 VolkerK 的回答是明确且内容丰富的。谢谢:)
    【解决方案2】:

    在数据库中测试超过 2300000 行,类型:InnoDB,大小接近 1 GiB,使用 xhprof

    测试1:

        ....SELECT COUNT(id) as cnt FROM $table_name....;
           row= mysqli_fetch_assoc($res2);
       echo $row['cnt'];
            //result1:
            1,144,106
            1,230,576
            1,173,449
            1,163,163
            1,218,992
    

    测试2:

    ....SELECT COUNT(*) as cnt FROM $table_name....;
           row= mysqli_fetch_assoc($res2);
       echo $row['cnt'];
    //result2:
    1,120,253
    1,118,243   
    1,118,852
    1,092,419
    1,081,316
    

    测试3:

     ....SELECT * FROM $table_name....;
        echo mysqli_num_rows($res2);
        //result3:
    7,212,476
    6,530,615
    7,014,546
    7,169,629
    7,295,878
    

    测试4:

         ....SELECT * FROM $table_name....;
            echo mysqli_num_rows($res2);
            //result4:
    1,441,228
    1,671,616
    1,483,050
    1,446,315
    1,647,019
    

    结论: 最快的方法是在 test2 中:

    ....SELECT COUNT(*) as cnt FROM $table_name....;
           row= mysqli_fetch_assoc($res2);
       echo $row['cnt'];
    

    【讨论】:

      【解决方案3】:

      绝对是第一个。 MySQL 通常可以通过查看索引而不是整个表来做到这一点,如果您使用 MyISAM(默认),则表的行数存储在表元数据中,并将立即返回 .

      您的第二种方法不仅会将整个表读入内存,还会在客户端计算行数之前通过网络将其发送给客户端。太浪费了!

      【讨论】:

        【解决方案4】:

        我真的认为不需要任何测试。

        在 SQL 查询中执行 COUNT

        1) 只发回一行数据 给客户(而不是每一行)

        2) 让 SQL 进行计数 对你来说,这可能总是会发生 比 PHP 更快。

        【讨论】:

          【解决方案5】:

          我猜count(1) 会更快:

          $res = mysql_query("SELECT count(1) as `number` FROM `table1`");
          $count = mysql_fetch_result($res,0,'number');
          

          虽然没有尝试过建议的方法,第一种使数据库获取所有记录并在数据库中计数,第二种使数据库为所有记录获取一个单独的字段并计算服务器上的结果数。 根据经验,您为特定记录获取的数据越少,花费的时间就越少,因此我会投票支持更新的第一种方法(为每条记录获取常量并计算获取的常量数量)。

          【讨论】:

          • 如果存储引擎是 MyISAM 并且没有 WHERE 条件,count(*) 会更快,因为为 MyISAM 表存储了准确的记录数。
          • 您的猜测可能适得其反 - COUNT(*) 是获取结果集大小的惯用方法,任何值得其盐的数据库都将针对它进行优化。
          • Count(*) 中的 * 表示“不查看数据,只计算记录”,而不是 Count(colname)。
          【解决方案6】:

          将 Count 与 index 和 inodb 一起使用会使它变得太慢,但是当与 mysqli_num_rows 一起使用时,它会毫无延迟地返回。您可以在http://ssajalandhar.org/generalinstruction-0-1-0.html 检查mysqli_num_rows 结果,它不会花费几分之一秒来加载。对我来说,mysqli 的效果很棒。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-03
            • 2010-09-16
            • 2010-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多