SQL& PHP - 哪个更快mysql_num_rows()或'select count()'?

时间:2010-03-20 23:46:32

标签: php sql performance

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

$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);

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

6 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:7)

在数据库中使用 2300000行进行测试,键入: InnoDB ,大小接近1 GiB,使用 xhprof

<强> TEST1:

    ....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

<强> TEST2:

....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

<强> TEST3:

 ....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

<强> TEST4:

     ....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'];

答案 2 :(得分:6)

绝对是第一个。 MySQL通常可以通过查看索引而不是整个表来执行此操作,如果使用MyISAM(默认值),表的行计数将存储在表元数据中,并将立即返回

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

答案 3 :(得分:1)

我认为不需要进行任何测试。

在SQL查询中执行COUNT

1)只返回一行数据     到客户端(而不是每一行)

2)让SQL做计数     对你来说可能永远都是     要快于PHP。

答案 4 :(得分:0)

我猜count(1)会更快:

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

虽然没有尝试过提出的方法,但是第一个让数据库获取所有记录并在数据库中计算它们,第二个使数据库为所有记录获取一个单独的字段并计算服务器上的结果数。登记/> 根据经验,您为特定记录获取的数据越少,所需的时间就越少,因此我会投票选择更新的第一个方法(为每个记录提取常量并计算获取的常量数)。

答案 5 :(得分:-3)

使用带索引和inodb的Count会使它太慢,但是当它与mysqli_num_rows一起使用时,它会毫无延迟地返回。你可以在http://ssajalandhar.org/generalinstruction-0-1-0.html检查mysqli_num_rows结果,它不会花费一小部分时间来加载。对我来说,mysqli很棒。