Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
PHP&;PDO:哪个更快?正在获取计数(*)或行计数()?_Php_Mysql_Mysqli_Pdo - Fatal编程技术网

PHP&;PDO:哪个更快?正在获取计数(*)或行计数()?

PHP&;PDO:哪个更快?正在获取计数(*)或行计数()?,php,mysql,mysqli,pdo,Php,Mysql,Mysqli,Pdo,好的,我的问题是我有一个脚本,在每个页面上加载,它通过检查名为“禁止”的列来检查登录用户是否被禁止,该列可以输出0(未禁止)或1(禁止)。我尝试过搜索,但没有找到性能更好的绝对答案: 正在获取计数(*)查询: 使用rowCount()而不是获取: $query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1"); $query->execute(array(":ID" => $USE

好的,我的问题是我有一个脚本,在每个页面上加载,它通过检查名为“禁止”的列来检查登录用户是否被禁止,该列可以输出0(未禁止)或1(禁止)。我尝试过搜索,但没有找到性能更好的绝对答案:

正在获取计数(*)查询:

使用rowCount()而不是获取:

$query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1");
$query->execute(array(":ID" => $USER_ID));
if ($query->rowCount() > 0) {
    // USER IS BANNED! SHOW ERROR MESSAGE!
}

我使用200k个随机生成的条目执行了一个基准测试,其中包含三列id、name和banked。3467名用户被随机选择禁止使用。我正在AWS micro实例上使用以下配置:

PHP7.0.30-0

Ubuntu 0.16.04.1

MySQL 5.7.22-0

基准测试结果:

COUNT(*)执行耗时0.00022506713867188秒

rowcount()执行耗时0.00011420249938965秒


rowcount()
是赢家。

我对随机生成的200k个条目执行了基准测试,其中包含三列id、名称和禁止。3467名用户被随机选择禁止使用。我正在AWS micro实例上使用以下配置:

PHP7.0.30-0

Ubuntu 0.16.04.1

MySQL 5.7.22-0

基准测试结果:

COUNT(*)执行耗时0.00022506713867188秒

rowcount()执行耗时0.00011420249938965秒

rowcount()
获胜

  • select COUNT(*)与select*不同
  • fetchColumn()和rowCount()都是由mysql执行的

    (1) 如果mysql中的数据太多,会影响性能

    (2) 另外,你可以认为它们是一样的,你可以同时使用它们

  • 如果选择第一种方法,mysql会返回所有的数据结果, 它将使用数据转换、网络、时间等

  • 所以你应该考虑一下你的真实环境来决定使用哪一个。

  • select COUNT(*)与select*不同
  • fetchColumn()和rowCount()都是由mysql执行的

    (1) 如果mysql中的数据太多,会影响性能

    (2) 另外,你可以认为它们是一样的,你可以同时使用它们

  • 如果选择第一种方法,mysql会返回所有的数据结果, 它将使用数据转换、网络、时间等


  • 所以你应该考虑一下你的真实环境来决定使用哪一个环境。回显开始时间和停止时间之间的时间差。多次执行此操作。可以添加
    限制1
    ,以限制第二个限制查找更多行。在第二种情况下,也可以
    选择1
    。。。但我强烈怀疑我们谈论的是性能上的微小差异,除非你是Google/Facebook之类的人,否则就不值得费心了。问题的可能重复取决于使用的表引擎、使用的索引和表大小。。但是对于计数,
    选择COUNT(*)…
    将是最有意义的,并且如果正在使用索引,将表现得最好测试它!回显开始时间和停止时间之间的时间差。多次执行此操作。可以添加
    限制1
    ,以限制第二个限制查找更多行。在第二种情况下,也可以
    选择1
    。。。但我强烈怀疑我们谈论的是性能上的微小差异,除非你是Google/Facebook之类的人,否则就不值得费心了。问题的可能重复取决于使用的表引擎、使用的索引和表大小。。但是对于计数,
    选择COUNT(*)…
    将最有意义,并且在使用索引的情况下性能最佳。您是否尝试了重复标记的代码?如果您已经进行了一些设置,则会很有趣。
    rowCount
    不是一种可靠的方法来计算select获取的行数。
    select EXISTS
    rowCount()
    count(*)慢30%
    您是否尝试过重复标记的代码?如果您已经进行了一些设置,则会很有趣。
    rowCount
    不是一种可靠的方法来计算select获取的行数
    select EXISTS
    rowCount()
    count(*)慢30%
    $query = $PDO->prepare("SELECT banned FROM users WHERE id = :ID AND banned = 1");
    $query->execute(array(":ID" => $USER_ID));
    if ($query->rowCount() > 0) {
        // USER IS BANNED! SHOW ERROR MESSAGE!
    }