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

Joe*_*oel 30 php sql performance

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

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

要么

$res = mysql_query("SELECT `ID` FROM `table1`");
$count = mysql_num_rows($res);
Run Code Online (Sandbox Code Playgroud)

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

Vol*_*erK 30

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

此外,对于某些引擎(如MyISAM),MySQL可以从表的索引提供Count(*)请求,而不会访问实际数据.SELECT * FROM foo另一方面,A 导致全表扫描,MySQL必须读取每个数据集.


San*_*nex 9

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

测试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
Run Code Online (Sandbox Code Playgroud)

测试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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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


rjh*_*rjh 6

绝对是第一个.MySQL的通常可以通过看一个指标,而不是整个表中做到这一点,如果你使用MyISAM(默认值),该行数的表存储在表中的元数据,并会退回瞬间.

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