【问题标题】:PHP & PDO: Which is faster? Fetching COUNT(*) or rowCount()?PHP 和 PDO:哪个更快?获取 COUNT(*) 或 rowCount()?
【发布时间】:2018-05-21 14:57:22
【问题描述】:

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

获取 COUNT(*) 查询:

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

使用 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!
}

【问题讨论】:

  • 测试一下!回显开始时间和停止时间之间的时间差。多次这样做。
  • 可以添加limit 1 以限制第二个查找更多行。
  • 在第二种情况下也可以SELECT 1...但我强烈怀疑我们谈论的是性能上如此微小的差异,除非你有点像谷歌/Facebook,否则不值得为此烦恼大小。
  • 问题取决于使用的表引擎、使用的索引和表大小。但要计算SELECT COUNT(*) ... 最有意义,并且如果使用索引会表现最好

标签: php mysql mysqli pdo


【解决方案1】:

我使用 20 万个随机生成的条目执行了基准测试,其中包含三列 id、name 和 ban。 3467个用户被随机选择被封禁。我在 AWS 微实例上使用以下配置:

PHP 7.0.30-0

Ubuntu 0.16.04.1

MySQL 5.7.22-0

基准测试结果:

COUNT(*) execution took 0.00022506713867188 seconds

rowcount() execution took 0.00011420249938965 seconds

rowcount() 是获胜者。

【讨论】:

  • 您是否尝试过标记重复的代码?如果您已经进行了一些设置会很有趣。
  • rowCount 不是计算选择获取的行数的可靠方法
  • SELECT EXISTSrowcount()COUNT(*) 慢 30%
【解决方案2】:
  1. 选择 COUNT(*) 与选择 * 不同。
  2. fetchColumn()和rowCount()都是mysql执行的

    (1)mysql中数据过多,会影响性能

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多