Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL和PHP-mysql\u num\u rows()或“select count()”哪个更快?_Php_Sql_Performance - Fatal编程技术网

SQL和PHP-mysql\u num\u rows()或“select count()”哪个更快?

SQL和PHP-mysql\u num\u rows()或“select count()”哪个更快?,php,sql,performance,Php,Sql,Performance,我只是想知道,如果我只是想得到表中的行数,那么哪种方法是最有效的 $res = mysql_query("SELECT count(*) as `number` FROM `table1`"); $count = mysql_fetch_result($res,0,'number'); 或 有人对此做过适当的测试吗?我想count1会更快: $res = mysql_query("SELECT count(1) as `number` FROM `table1`"); $count = mys

我只是想知道,如果我只是想得到表中的行数,那么哪种方法是最有效的

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

有人对此做过适当的测试吗?

我想count1会更快:

$res = mysql_query("SELECT count(1) as `number` FROM `table1`");
$count = mysql_fetch_result($res,0,'number');
虽然还没有尝试提出的方法,但第一种方法使数据库获取所有记录并在数据库中计数,第二种方法使数据库获取所有记录的单独字段并在服务器上计数结果数。 根据经验,为特定记录获取的数据越少,所需的时间就越短,因此我投票支持更新的第一种方法,即为每个记录获取常量,并计算获取的常量数。

在返回之前,将所有结果记录从MySQL传输到php pcProcess。仅此一点就可以让mysql的行数版本变慢


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

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

在SQL查询中进行计数

1只将一行数据发送回 到客户端而不是每行

2让SQL进行计数 对你来说,这可能永远都会发生
比PHP快。

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


第二种方法不仅将整个表读取到内存中,而且在客户机计算行数之前通过网络将其发送给客户机。太浪费了

在索引和inodb中使用Count会使其速度太慢,但在与mysqli_num_行一起使用时,它会毫不延迟地返回。您可以检查mysqli_num_rows结果,因为加载它不会花费几分之一秒的时间。对我来说,mysqli非常棒。

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

测试1:

测试2:

测试3:

测试4:

结论: 最快的方法是test2:

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

如果存储引擎是MyISAM,并且没有WHERE条件,那么count*会更快,因为MyISAM表会存储精确的记录计数。您的猜测可能会适得其反-count*是获取结果集大小的惯用方法,任何值得使用的数据库都会为此进行优化。而*in count*意味着不查看数据,只需将记录数出来,而不是Countcolname。谢谢大家的帖子,我必须选一个。沃尔克的回答是明确的,内容丰富。谢谢:
    ....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
....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
 ....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
     ....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
....SELECT COUNT(*) as cnt FROM $table_name....;
       row= mysqli_fetch_assoc($res2);
   echo $row['cnt'];